Foros del Web » Programando para Internet » Javascript »

porque no me funciona bien esta funcion js

Estas en el tema de porque no me funciona bien esta funcion js en el foro de Javascript en Foros del Web. Hola, he estado mirando por el foro y por google para montar esta codigo pero no consigo hacerlo funcionar bien, trata de mostrar en pantalla ...
  #1 (permalink)  
Antiguo 26/09/2011, 04:57
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
porque no me funciona bien esta funcion js

Hola, he estado mirando por el foro y por google para montar esta codigo pero no consigo hacerlo funcionar bien, trata de mostrar en pantalla los nombres que tengo guardado en un archivo xml, estos nombes me los tendria que mostrar uno a uno hasta acabar con todos los nombres y volver a empezar.

Muestro codigo por si alguien me quiere corregir, saludos.

Código Javascript:
Ver original
  1. function MostrarNombres(){
  2.     if (Ajax.readyState == 4) {
  3.         if(Ajax.status == 200) {
  4.      var xml  = Ajax.responseXML;
  5.      for (i = 0; i < xml.getElementsByTagName('nombre').length; i++){
  6.         var nombres= xml.getElementsByTagName('nombre')[i].firstChild.nodeValue;
  7.      
  8. document.getElementById("nombres").innerHTML ='<p>'+nombres+'</p>';
  9.                  
  10.                   if(i>=(nombres_img.length)){i = 0}
  11.             }
  12.         }
  13.     }
  14. }
  15.  
  16.         window.onload = MostrarRegistos;
  17.         setInterval(MostrarRegistos,4000)
  18.        
  19. var  Ajax = objetoAjax();
  20. Ajax.open('get', 'archivo.xml');
  21. Ajax.onreadystatechange = MostrarNombres;
  22. Ajax.send('');
  23.  
  24. function objetoAjax()   {
  25.         if (window.XMLHttpRequest)
  26.             _ajax = new XMLHttpRequest();
  27.         else
  28.             if (window.ActiveXObject)
  29.                 _ajax = new ActiveXObject("Microsoft.XMLHTTP");
  30.             else
  31.                 _ajax = false;
  32.         return _ajax;
  33.     }

el xml es algo asin:

Código XML:
Ver original
  1. <datos><nombre>.jose</nombre><nombre>ana</nombre><nombre>pedro</nombre><nombre>sogia</nombre></datos>


Código HTML:
Ver original
  1. <div id="registro"></div>
  2. </body>

Última edición por azaz; 26/09/2011 a las 05:25
  #2 (permalink)  
Antiguo 26/09/2011, 06:24
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: porque no me funciona bien esta funcion js

prueba a cambiar estas cosas
Cita:
function MostrarNombres(){

* * * * var nombres= xml.getElementsByTagName('nombre')[i].firstChild.nodeValue; // no asignes el mismo nombre a una variable y a un objeto, tendrás problemas en algunos navegadores
* * *
document.getElementById("nombres").innerHTML ='<p>'+nombres+'</p>'; // la id del campo no sería, registro??
* * * * * * * * *
* * * * * * * * * if(i>=(nombres_img.length)){i = 0} // nombres_img no está definido
* * * * * * }
* * * * }
* * }
}
*
* * * * window.onload = MostrarRegistos;
* * * * setInterval(MostrarRegistos,4000) // no le encuentro sentido. un ciclo interminable y reutilizas una vez tras otra el objeto
* * * *
var *Ajax = objetoAjax();
Ajax.open('get', 'archivo.xml'); // no usas el 3º parámetro (sincrono o asincrono)
Ajax.onreadystatechange = MostrarNombres;
Ajax.send(''); // envia null
*
function objetoAjax() * {
var ajax = false;
if (window.XMLHttpRequest) {
ajax = new XMLHttpRequest();

if (ajax.overrideMimeType) {
ajax.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) {
try {
ajax = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
ajax = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
return ajax;
}
  #3 (permalink)  
Antiguo 26/09/2011, 06:34
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: porque no me funciona bien esta funcion js

IsaBelM, cambie lo que me dijistes pero sigue sin funcionarme.

Saludos.
  #4 (permalink)  
Antiguo 26/09/2011, 08:18
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: porque no me funciona bien esta funcion js

normal que no funcionara y yo estoy
Cita:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<meta http-equiv="Content-Type" content="application/xhtml; charset=utf-8" />
<title></title>
<script type="text/javascript">
function MostrarNombres(){
var Ajax = objetoAjax();
Ajax.onreadystatechange = function() {



* * if (Ajax.readyState == 4) {
* * * * if(Ajax.status == 200) {
* * *var xml *= Ajax.responseXML;
* * *for (var i = 0; i < xml.getElementsByTagName('nombre').length; i++){

document.getElementById("registro").innerHTML +='<p>'+ xml.getElementsByTagName('nombre')[i].firstChild.nodeValue+'</p>';
* * * * * * * * *
* * * * * * * * *
* * * * * * }
* * * * }
* * }
}
Ajax.open('get', 'archivo.xml', false);
Ajax.send(null);
}
*
* * *

* * * *

*
function objetoAjax(){
* * * * if (window.XMLHttpRequest)
* * * * * * _ajax = new XMLHttpRequest();
* * * * else
* * * * * * if (window.ActiveXObject)
* * * * * * * * _ajax = new ActiveXObject("Microsoft.XMLHTTP");
* * * * * * else
* * * * * * * * _ajax = false;
* * * * return _ajax;
* * }

window.onload = MostrarNombres;
</script>
</head>
<body>
<div id="registro"></div>
</body>
</html>
  #5 (permalink)  
Antiguo 26/09/2011, 09:58
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: porque no me funciona bien esta funcion js

Hola IsaBelM, el codigo que posteastes funciona muy bien, pero realmente no hace lo que yo quiero, en el codigo que posteastes arriba muestra todos los resultados juntos del xml y yo lo que pretendia es mostrar los resultados uno a uno.

El codigo que quiero es este, funciona bien trata de mostrar en dos en dos los resultados en pantalla, cuyo resultados recojo de una basa de datos y los paso a un array js, pero claro no consigo adaptarlo a lo que yo quiero, yo lo que quiero es que los datos los recoja de un archivo xml, no de la base de datos, intente montar este script con lo que encontre en el foro y en google pero no consigo hacerlo funcionar bien, muestro el codigo que si funciona, pero claro recuerdo que lo que quiero cambiar es cojer los datos de un archivo xml en vez de la base de datos.

el codigo es este:

Código PHP:
Ver original
  1. //consulta
  2. //creo el array php
  3. $nombres_empresa = array();
  4. while ($row = mysql_fetch_array($consulta)){
  5. $nombres_empresa[]= $row['nombre'];
  6. }
  7. ?>
  8. <script language='javascript'>
  9. //paso el array php a js
  10. var nombres_empresa[]=new Array();
  11. <?php
  12. for ($i = 0, $total = count($nombres_empresa); $i < $total; $i ++)
  13. echo "\nnombres_empresa[$i] = '$nombres_empresa[$i]';";
  14. ?>
  15. //creo la funcion js
  16. var pos = 0;
  17.  function MostrarNombres(){
  18.    
  19.     for (i=1;i<=2;i++){
  20.        
  21.              nombre_empresa = nombres_empresa[pos];
  22.            
  23.        
  24. document.getElementById("registro"+i).innerHTML ='<p>'+nombre_empresa+'</p>';
  25.  
  26.                      
  27.                      pos++;
  28.                 if(pos>=(nombres_empresa.length)){pos = 0}
  29.             }
  30.         }
  31.            
  32.         window.onload = MostrarNombres;
  33.        
  34.         setInterval(MostrarNombres,2000)
  35.        
  36. </script>
  37.     </head>
  38.     <body>
  39.            
  40.             <div id="registro1"></div>
  41.             <div id="registro2"></div>
  42.            
  43.        
  44.         </body>
  45. </html>

Espero que me podais ayudar,saludos.
  #6 (permalink)  
Antiguo 26/09/2011, 10:15
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 9 meses
Puntos: 27
Respuesta: porque no me funciona bien esta funcion js

El código que han posteado sirve como base, pero con eso tú ya deberías ser capaz de alterar el código para hacer lo que quieres. Podrías declarar algunas variables globales y jugar con eso:

Código:
var procesamiento, xml = null, contador=0;
function MostrarRegistro() {
        try {
                document.getElementById("registro").innerHTML ='<p>'+ xml.getElementsByTagName('nombre')[contador].firstChild.nodeValue+'</p>';
                contador ++;
        }
        catch(e) {
                //Y aqui se reiniciaría, o podrías detener detener el ciclo infinito u otra cosa
                document.getElementById("registro").innerHTML = '';
                contador = 0;
        }
}

function MostarNombres() {
        var ajax = objetoAjax();
        ajax.open('get','archivo.xml');
        ajax.onreadystatechange = function() {
                if(ajax.readyState == 4){
                        if(ajax.status == 200) {
                                xml=ajax.responseXML;
                                if(xml.getElementsByTagName('nombre').length > 0)
                                        procesamiento = window.setInterval(MostrarRegistro, 4000);
                        }
                }
        }
        ajax.send(null);
}
....
Otra cosa sería si piensas que los datos a devolver van a cambiar y por tanto quieres actualizar cada cierto tiempo la variable XML volviendo a consultar o algo así.

El último código que posteaste no te funcionará por que que deseas crear y ejecutar javascript directamente desde el archivo al que llamas con open. Todo tu javascript debería estar en el fichero js vinculado al archivo html principal. De otra forma tendrías que valerte de trucos poco trasparentes , que no son necesarios para resolver la problemática que te aqueja. Te recomiendo leer un poco más de Ajax.

Saludos.

Saludos
  #7 (permalink)  
Antiguo 26/09/2011, 10:33
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: porque no me funciona bien esta funcion js

refreegrata, probe tu codigo pero no me funciona, aunque tampoco lo entendi muy bien si pudieras postearlo entero con explicaciones para entenderlo, saludos.
  #8 (permalink)  
Antiguo 26/09/2011, 10:57
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 9 meses
Puntos: 27
Respuesta: porque no me funciona bien esta funcion js

hay un pequeño error, le puse mal el nombre a una función:

"MostarNombres" en vez de "MostrarNombres"

Cambiando eso funciona. Obviamente está consultando a archivo.xml y no a un archivo.php, por que es lo consultaste en el primer post y deberías partir probando eso. Una vez funcionando intenta buscar los valores de la base de datos. Tampoco te he posteado todo el código javascript, sólo lo que cambie con respecto a lo posteado por IsaBelM.

La idea es simple, al cargar la página consulta el archivo XML con Ajax, guarda la respuesta en una variable y, de haber resultados, iniciar el ciclo para mostrarlos. Para acceder a estos deberás definir la variable con los datos, asociar el setInterval y mantener un contador, todos como variables globales. Una vez se acabe de recorrer la respuesta reiniciar el contador para volver a mostrar los resultados, o podrías detener el ciclo si no los quieres volver a mostar(por eso defíne "procesamiento" como global).

Mas o menos eso. Saludos.

A propósito, ¿no usas herramientas como Firebug, o chequeas regularmente la consola de errores?, lo digo por qué el pequeño detallito con el nombre de la función debiste haberlo visto fácil.
  #9 (permalink)  
Antiguo 26/09/2011, 11:10
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: porque no me funciona bien esta funcion js

ahora funciona, gracias y saludos.
  #10 (permalink)  
Antiguo 26/09/2011, 11:14
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 9 meses
Puntos: 27
Respuesta: porque no me funciona bien esta funcion js

Que bueno que te haya funcionado.

Última edición por refreegrata; 26/09/2011 a las 11:17 Razón: No me dí cuenta de la actualización de los comentarios
  #11 (permalink)  
Antiguo 26/09/2011, 14:28
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: porque no me funciona bien esta funcion js

hola refreegrata, bueno estoy aqui de nuevo porque estoy intentando cambiar el codigo, para cuando recorro todos los datos xml, no se quede la pantalla en blanco, probe de colocar en catch(e) lo mismo que el try y funciono bien, pero mi problema biene cuando intento crear mas div registro con un bucle for, que no me los muestra seguidos los datos, es decir cuando acaba de recorrer todo el xml, lo que me hace es repetirme los nombres hasta acabar los div creados y luego vuelve a mostrar los nombres por su orden, yo no quiero eso quiero que los muestre seguidos, no se si me explique bien. esto es posible?

Saludos.

Última edición por azaz; 26/09/2011 a las 17:10
  #12 (permalink)  
Antiguo 26/09/2011, 17:30
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 9 meses
Puntos: 27
Respuesta: porque no me funciona bien esta funcion js

Mira, pero eso es fácil. Si quieres que no se vaya borrando debes sumar en vez de asignar en el innerHTML. Si no quieres que los borre al final y no repita el ciclo sólo debes pararlo:

Código:
...
function MostrarRegistro() {
        try {
                document.getElementById("registro").innerHTML +='<p>'+ xml.getElementsByTagName('nombre')[contador].firstChild.nodeValue+'</p>';
                contador ++;
        }
        catch(e) {
                //Y aqui se reiniciaría, o podrías detener detener el ciclo infinito u otra cosa
                try { window.clearInterval(procesamiento); } catch(e) {}
                contador = 0;
        }
}
...
  #13 (permalink)  
Antiguo 27/09/2011, 03:17
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: porque no me funciona bien esta funcion js

Hola refreegrata, gracias de nuevo por tu colaboracion, ahora si que lo entendi perfectamente.

Saludos.

Última edición por azaz; 27/09/2011 a las 04:10
  #14 (permalink)  
Antiguo 04/10/2011, 15:45
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: porque no me funciona bien esta funcion js

Cita:
Otra cosa sería si piensas que los datos a devolver van a cambiar y por tanto quieres actualizar cada cierto tiempo la variable XML volviendo a consultar o algo así.
Estoy intentando cambiar el xml de forma dinamica cada vez que seleciono una opcion en un select y funciona correctamente el xml me lo cambia, pero los datos en pantalla no alguna idea de como conseguir que me cambien los datos.
Saludos.

Etiquetas: funcion, html, js
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:08.