Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Bug en firebug ?

Estas en el tema de Bug en firebug ? en el foro de Javascript en Foros del Web. Hola gente! Tratando de corregir unas funciones que habia escrito para manejo de Ajax me encontre con un problema para mi indescifrable...... un extraño comportamiento ...
  #1 (permalink)  
Antiguo 24/06/2014, 16:47
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 15 años, 9 meses
Puntos: 292
Bug en firebug ?

Hola gente!

Tratando de corregir unas funciones que habia escrito para manejo de Ajax me encontre con un problema para mi indescifrable...... un extraño comportamiento del "Inspect Element" tanto de Chrome como de Firefox.

Me dice primero que un objeto Ajax tiene status:0 y cuando lo inspecciono dice que tiene status:200

Por otro lado "copio" el objeto a otra variable (ob = aR) y cuando la miro dice algo completamente distinto!

Alguien entiende que esta pasando ? y por que tanto Chrome con Firefox observan este comportamiento ?



http://i1353.photobucket.com/albums/...psc8991cb4.png

Código Javascript:
Ver original
  1. <html>
  2. <body>
  3.  
  4. <form name="personal" action="../pruebas/ver_dump $_REQUEST.php" id="personal1">
  5.     Edad:
  6.     <input type="text" id="edad" /> <br />
  7.     Peso:
  8.     <input type="text" id="peso"  /><br />
  9.     Sexo:
  10.     <select id="sexo">
  11.         <option value="MASCULINO">M</option>
  12.         <option value="FEMENINO">F</option>
  13.     </select>  
  14. </form>
  15.  
  16. <div id="outputAjax">Resultados del lado del servidor</div>
  17.  
  18.  
  19. <script>
  20.  
  21. var edad_el     = document.getElementById('edad'),
  22.     peso_el     = document.getElementById('peso'),
  23.     sexo_el     = document.getElementById('sexo'),
  24.     frm         = document.getElementById('personal1'),
  25.     outputAjax  = document.getElementById('outputAjax');
  26.  
  27.  
  28.     onreadystatechangeHandler = function(aR)
  29.     {
  30.         ob = aR;
  31.        
  32.         if(ob.readyState == 4  && ob.status == 200 ){  
  33.             console.log(ob.responseText);
  34.             outputAjax.innerHTML = ob.responseText;
  35.         }else{
  36.             console.log ('readyState: '+ob.readyState+' y status: '+ob.status);
  37.             console.log (ob);
  38.         }  
  39.        
  40.            
  41.     };     
  42.  
  43.     function ajaxRequestObjectBuilder()
  44.     {    
  45.     var object;
  46.    
  47.     try{
  48.         // Opera 8.0+, Firefox, Safari
  49.         object = new XMLHttpRequest();
  50.     } catch (e){
  51.         // Internet Explorer
  52.         try{
  53.             object = new ActiveXObject("Msxml2.XMLHTTP");
  54.         } catch (e) {
  55.             try{
  56.                 object = new ActiveXObject("Microsoft.XMLHTTP");
  57.             } catch (e){                
  58.                 alert("Error en Ajax");
  59.                 return false;
  60.             }
  61.         }
  62.        
  63.     }          
  64.     return object;
  65.     }
  66.  
  67. function ajaxByGet()
  68. {
  69.  
  70. var ajaxRequest = ajaxRequestObjectBuilder();
  71.  
  72.     // registro funcion para Ajax
  73.     ajaxRequest.onreadystatechange = onreadystatechangeHandler(ajaxRequest);
  74.     //console.log(ajaxRequest);
  75.  
  76. var edad = edad_el.value,
  77.     peso = peso_el.value,
  78.     sexo = sexo_el.value;
  79.  
  80.     var params = "?edad=" + edad + "&peso=" + peso + "&sexo=" + sexo;
  81.     ajaxRequest.open("GET", frm.action + '?' + params, true);
  82.     ajaxRequest.send(null);
  83. }
  84.  
  85.  
  86. // Registro cambios en elementos deel formulario: onChange
  87. document.getElementById('personal1').addEventListener("change", function (event)
  88. {
  89.     var tagname = event.target.tagName;
  90.    
  91.     if (tagname == 'SELECT')
  92.     {
  93.         ajaxByGet();        
  94.     }
  95. });
  96.  
  97. // Registro cambios en elementos deel formulario: onKeyup
  98. document.getElementById('personal1').addEventListener("keyup", function (event)
  99. {
  100.     var tagname = event.target.tagName;
  101.    
  102.     if (tagname == 'INPUT' || tagname == 'TEXTAREA')
  103.     {
  104.         ajaxByGet();        
  105.     }
  106. });
  107.  
  108. </script>
  109.  
  110.  
  111. </body>
  112. </html>
  113. </html>

y la parte que estaba debugueando es esta:

Código Javascript:
Ver original
  1. onreadystatechangeHandler = function(aR)
  2.     {
  3.         ob = aR;
  4.        
  5.         if(ob.readyState == 4  && ob.status == 200 ){  
  6.             console.log(ob.responseText);
  7.             outputAjax.innerHTML = ob.responseText;
  8.         }else{
  9.             console.log ('readyState: '+ob.readyState+' y status: '+ob.status);
  10.             console.log (ob);
  11.         }              
  12.     };

Desde ya muchas gracias
__________________
Salu2!
  #2 (permalink)  
Antiguo 24/06/2014, 17:10
Avatar de jp91  
Fecha de Ingreso: mayo-2014
Mensajes: 94
Antigüedad: 8 años, 8 meses
Puntos: 11
Respuesta: Bug en firebug ?

Me asombre con el titulo un bug en Firefox(representa dinero) jejejej lo que pasa por ejemplo en chrome te muestra una primera vista rapida del objeto pero cuando lo expandes te muestra lo que se esta ejecutando.
__________________
OOoo Como hacer ooOO
juegos con Html5.
  #3 (permalink)  
Antiguo 24/06/2014, 17:15
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 13 años, 9 meses
Puntos: 1485
Respuesta: Bug en firebug ?

buenas...
¿sabes lo que significa esa i azul que aparece al final de la primera línea del log?


eso significa que al expandir el objeto, la consola captura los valores reales la primera vez que se expande. lo que ves en la primera linea (antes de la i azul) es un snippet de los valores al momento de imprimirse en la consola y no necesariamente refleja el valor real de la propiedad.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #4 (permalink)  
Antiguo 24/06/2014, 17:55
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 15 años, 9 meses
Puntos: 292
Respuesta: Bug en firebug ?

Gracias amigos...... lo que me parece confuso o errado....es que cuando expando aparece una informacion que introduje en los campos (REAL) pero los estados que muestra en el objeto Ajax son aparentemente errados ya que no se condicen con el flujo del programa.

...en cambio.. en la version sin expandir ... dice que el status es 0 (algo si se condice con el flujo) pero que no hay nada en los campos (response y responseText) lo cual no tiene sentido.


Entonces... estan AMBOS SNAPS mal ?? ninguno es real ?

FIJENSE que imprimo previamente el valor del status y readyState desde el mismo programa (tampoco es confiable?) y me dice "readyState: 0 y status: 0" y luego el objeto expandido (segun uds real) dice que el status es 200 (?!?!?!)


Y un alert() tambien da valores ficticios ?

Código Javascript:
Ver original
  1. alert ('readyState: '+aR.readyState+' y status: '+aR.status);


<< eso me dice "readyState: 0 y status: 0" y segun Uds el objeto expandido da informacion REAL pero dice que el status es 200
__________________
Salu2!

Última edición por Italico76; 24/06/2014 a las 18:15
  #5 (permalink)  
Antiguo 24/06/2014, 18:33
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 15 años, 9 meses
Puntos: 292
Respuesta: Bug en firebug ?

He actualizado mi respuesta y la hice mas completa.....
__________________
Salu2!
  #6 (permalink)  
Antiguo 24/06/2014, 18:56
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 13 años, 9 meses
Puntos: 1485
Respuesta: Bug en firebug ?

los valores que muestras en el console.log y alert no son erroneos. son los reales, pero reales para ese momento que se hizo el log o alert. luego cuando depuras en la consola, puede que los valores no coincidan. esto por dos cosas principales: primero porque estas trabajando sobre el mismo objeto, y segundo porque el estado de las propiedades han ido cambiando. en este caso, el estado cambia cada vez que se dispara el evento readystatechange. la consola, aunque muestre varias veces el mismo objeto en distintas circunstancias, todos ellos hacen referencia al mismo objeto. si se diera la situación donde tienes que expandir el log, la consola muestra el estado actual de ese objeto. si luego haces un cambio al objeto y vuelves a expandir el mismo log anterior, no va reflejar el nuevo cambio. tal como dice el tooltip del icono azul, el estado del objeto es capturado en la primera expansión. si por el contrario, tienes varios logs del mismo objeto (ninguno sin expandir), realizas algún cambio al objeto, al expandir los logs se mostrará el nuevo cambio. tu mismo puedes hacer la prueba con cualquier objeto que sea suficientemente largo que no se pueda mostrar en una sola línea de la consola. en definitiva, no es un bug.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 24/06/2014 a las 19:09 Razón: errata
  #7 (permalink)  
Antiguo 24/06/2014, 19:28
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 15 años, 9 meses
Puntos: 292
Respuesta: Bug en firebug ?

@zerokilled : "perfecto" ... llegue a imaginar algo asi (el titulo es amarillista) pero entonces no voy a poder separar la definicion de la funcion para onreadystatechange del resto de la funcion para manejo de Ajax ?

Dicho de otra forma...... debo chequear si el objeto esta listo..... pero sino lo esta.. simplemente pasa de largo y ya...... no se ejecuta nada.

No hay otra forma de manejar eso con handlers como he tratado o bien de disparar un evento cuando este listo el request en vez de estar preguntando si lo esta ?
__________________
Salu2!
  #8 (permalink)  
Antiguo 24/06/2014, 21:10
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 13 años, 9 meses
Puntos: 1485
Respuesta: Bug en firebug ?

quizas, y solo quizas, lo que estés buscando es el evento onloadend. se dispara cuando el request ha finalizado. pero ojo, el evento se dispara tanto el request sea exitoso o fallido. por otro lado, dicho evento se incorpora en XMLHttpRequest2, el cual aún está en fase de borrador.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #9 (permalink)  
Antiguo 24/06/2014, 21:14
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 15 años, 9 meses
Puntos: 292
Respuesta: Bug en firebug ?

Muchas gracias @zerokilled, entonces nada que hacer......... me pregunto como lo hara jQuery por ejemplo....... deberia ponerme a leer la libreria
__________________
Salu2!
  #10 (permalink)  
Antiguo 25/06/2014, 09:44
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 15 años, 9 meses
Puntos: 292
Respuesta: Bug en firebug ?

Código Javascript:
Ver original
  1. $.ajax({
  2.                 url: 'turul.php',
  3.                 type: 'POST'.
  4.                 data: 'cBar=' + $(this).val(),
  5.                 success: function(data){
  6.                     $('resultado').val(data);
  7.                 }
  8.             });

Viendo otro hilo confirmo que jQuery de alguna forma se las arregla para aceptar un Handler para onreadystatechange aunque ni idea como superan el problema que yo tengo.

... el consuelo que tengo.. es que perdi algo "generalidad" pero me quedo mas simple:


Código Javascript:
Ver original
  1. ajaxByPost('consulta',fieldsForm1,'outputfieldsForm1');

o lo mismo para GET:

Código Javascript:
Ver original
  1. ajaxByGet('consulta',fieldsForm1,'outputfieldsForm1');


http://www.forosdelweb.com/f13/ajax-...1/#post4612237
__________________
Salu2!

Última edición por Italico76; 25/06/2014 a las 09:54
  #11 (permalink)  
Antiguo 25/06/2014, 11:26
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.546
Antigüedad: 11 años, 2 meses
Puntos: 972
Respuesta: Bug en firebug ?

Lee esto, creo que es lo que buscas.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #12 (permalink)  
Antiguo 25/06/2014, 12:25
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 15 años, 9 meses
Puntos: 292
Respuesta: Bug en firebug ?

Cita:
Iniciado por Alexis88 Ver Mensaje
Lee esto, creo que es lo que buscas.
Si Alexis gracias... buenisimo pero lo necesito en JS nativo
__________________
Salu2!
  #13 (permalink)  
Antiguo 25/06/2014, 12:48
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 13 años, 9 meses
Puntos: 1485
Respuesta: Bug en firebug ?

no creo que sea tan complicado... se me ocurre que puedes crear una función que asigne eventos para un estado en particular. en realidad no es tan así... mas bien te enfocas en el aspecto del qué hacer para dicho estado mientras la función se encarga de invocar el argumento para el estado en particular. obviando la parte de un contenedor general para ajax.
Código:
var req = new XMLHttpRequest();
req.sucess = function(handler){
this.addEventListener('readystatechange', function(){
if(this.readyState == 4 && this.status == 200) handler.apply(this, arguments);
}, true);
};

req.sucess(function(){ console.log(arguments, this); });
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Etiquetas: ajax, bug, firebug, funcion, variable
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 16:47.