JavaScript - ajax en firefox3

   
Vista:

ajax en firefox3

Publicado por PasabaPorAqui (52 intervenciones) el 19/08/2008 14:40:44
Buenas.

Tengo el siguiente problema, tengo un código, que me funciona perfectamente en IE y en firefox1.5 y 2, pero no en el 3.

El codigo es el siguiente:

this.dataLoad=function(idComponente){
if (idComponente==""){
oTree=this;
var sEnv="Node=primerNivel";
var ajax=new PAjax();
var PHP=this.getDataSource();
ajax.open ("POST", PHP+"&Metodo=read", false);
ajax.onreadystatechange=function() {
if (ajax.readyState==4){
if(ajax.status==200){//el JSON tiene que devolver las nodes y si tienen hijos.iId,sNombre, bHijos
oTree._dataLoad2(ajax.responseText);
}else if(ajax.status==404){
alert("La direccion, al archivo "+PHP+" no existe");
}else{
alert("Error: ".ajax.status);
}
}
}
ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
ajax.send(sEnv);
}
else{
this._dataLoad2(document.getElementById(idComponente).value);
}
}

El fallo está en el onreadystatechange, al que no entra a pesar de hacer la peticion ajax. Comprobandolo con el firebug, veo que el readyState si que cambia, ya que pasa el valor de 1 a 4 al hacer el send, pero no entra.

Como ya digo esto solo me pasa en firefox3, ¿alguien sabe por que puede ser?, estoy buscando por internet, pero no encuentro ninguna referencia a esto, como si fuese yo el unico al que le pasa.

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:ajax en firefox3

Publicado por weirdmix (185 intervenciones) el 19/08/2008 23:23:08
por lo q veo usas JSON, ya buscaste en soporte de ellos para este problema?
porq no usas el objeto ajax normal?
porq no intentas hacer el objeto ajax global y crear una funcion q no sea al vuelo??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ajax en firefox3

Publicado por PasabaPorAqui (52 intervenciones) el 20/08/2008 09:18:24
La funcion está encapsulada en una clase, y esta forma parte de un framework, que es el motivo para que esté hecho así, no es por otra cosa.
El objeto ajax es normal, no es nada nuevo, aquí te dejo el código, que se puede encontrar en cualquier sitio en internet

function PAjax(){

var xmlHttp=false;
try{
xmlHttp= new XDomainRequest();//ie8
}catch (e){
try {

xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");

} catch (e) {

try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlHttp = false;
}
}
}

if (!xmlHttp && typeof XMLHttpRequest!='undefined') {

xmlHttp = new XMLHttpRequest();

}

return xmlHttp;

}

Como ves no tiene nada. En cuanto al JSON, no es el problema, depurando con el firebug, aunque no se dispare el evento onreadystatechange, si hace la peticion y si que devuelve el JSON como siempre, el problema es el código que se tenía que disparar en el evento, que no se lanza.

Por más que busco no encuentro ninguna referencia sobre esto, así que tiene que ser algo que implemente "mal", o al menos no muy bien, ya que en los firebug de los firefox anteriores, y en el IE, lo cogen sin problemas.

Gracias, por la repuesta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ajax en firefox3

Publicado por PasabaPorAqui (52 intervenciones) el 20/08/2008 14:36:34
Buenas, encontré la causa, pero no la solución

en la linea

ajax.open ("POST", PHP+"&Metodo=read", false);

al ponerlo a true para que sea asíncrono, funciona

ajax.open ("POST", PHP+"&Metodo=read", true);

Sin embargo, en varias partes del código, no lo puedo poner asíncrono, ya que requiero, que primero reciba la información, antes de continuar.

Me parece muy raro el fallo, y me sorprende no encontrar referencias sobre el mismo, así que supongo que para que falle eso, tengo que tener algo mal planteado en la funcion anterior.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ajax en firefox3

Publicado por PasabaPorAqui (52 intervenciones) el 21/08/2008 08:58:24
Bueno, me autorrespondo.

Después de mucho buscar, y finalmente ya con el tema de la sincronía, encontré que en el firefox, fallan este tipo de peticiones, de forma síncrona. La solución que encontré, es la de hacer un bucle que continúe hasta recibir los datos, de la siguiente manera:

Sustituir el onreadystatechange por esta función, despues de hacer el ajax.send()
while(1){
if(ajax.readyState==4){
if(ajax.status==200){
//yo llamo a esta funcion, cambiar la linea del oTree, por vuestras funciones
oTree._dataLoad2(ajax.responseText);
//el break, no se debe quitar, ya que si no nunca saldríais del bucle
break;
}else if(ajax.status==404){
alert("La direccion, al archivo "+PHP+" no existe");
break;
}else{
alert("Error: ".ajax.status);
break;
}
}
}

Tener un bucle esperando datos, no me parece muy eficiente, así que si alguien conoce una mejor manera de hacerlo le estaría muy agradecido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ajax en firefox3

Publicado por weirdmix (185 intervenciones) el 29/08/2008 23:03:48
no creo q sea ese el problema, aqui te dejo una funcion diferente a la q tienes para instanciar el objeto AJAX, hasta el momento me funciona bien tanto para IE7 como para firefox3 (no he probado en IE8 porq es beta todavia y generalmente los betas de microsoft son una porqueria)

function getHTTPObject() {

var xmlHttp=null;
try{ // Firefox, Opera 8.0+, Safari, IE 6 and up
xmlHttp=new XMLHttpRequest();
}catch (e){ // Internet Explorer 5 and before
try{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}catch (e){
alert("Your browser does not support AJAX!");
return false;
}
}
}
return xmlHttp;

}

espero te sirva
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ajax en firefox3

Publicado por Horacio (1 intervención) el 15/09/2008 19:28:56
Te comento que yo tuve el mismo problema, pero buscando encontre que el problema esta en tratar de hacer una peticion de forma síncrona y tratar de capturar los estados.
La solucion (la cual me dio resultado) fue la de poner la repsuesta despues del send, ya que si haces la peticion de manera sincrona, cuando pase el metodo send, ya dispondremos de una respuesta.

Ejemplo:

var ajax=new PAjax();

ajax.open ("POST", PHP+"&Metodo=read", false);
ajax.onreadystatechange=function() {
ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
ajax.send(sEnv);
oTree._dataLoad2(ajax.responseText);

De este modo me funcionó con ie, firefox1.5, 2 y 3.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar