Gracias por contestar Ktorce, y siento la tardanza, estaba de vacaciones, y sin internet (que mono tenia! )
Conseguí solucionar el problema, todo se debia a que no terminaba de entender la filosofia de Ajax.
Comento la solucion por si alguien vuelve a tener problemas.
Las peticiones se pueden hacer de dos formas, sincronas o asincronas.
En caso de ser asincronas, hace todas las peticiones a la vez, y las suele ir tratando segun venga. Por ello, en peticion.onreadystatechange, le asignamos la funcion encargada de tratar el resultado de la peticion. Y dentro de esta peticion, tenemos que controlar que el contenido este listo.
Un ejemplo de peticion asincrona sería:
Código:
function loadContent(url,method,funcion,param){
peticion = start_xhr();
if(peticion){
peticion.overrideMimeType('text/xml');
peticion.onreadystatechange=funcion;
peticion.open(method,url,true);
peticion.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
peticion.send(param);
}
}
function unaFuncion(){
if (req.readyState == 4) {
resp = req.responseText;
document.getElementById(ndiv).innerHTML = resp;
}
}
loadContent("http://url.es","GET","unaFuncion",null);
En cambio, las llamadas sincronas se resuelven una por una. Hasta que una no esta terminada, no sigue con la otra, de esta forma, no nos hace falta comprobar los estados y la funcion que pasamos a peticion.onreadystatechange nunca se ejecuta, sino que tenemos que ejecutarla a mano. A continuacion, un ejemplo de una llamada sincrona.
Código:
function loadContent(url,method,funcion,param){
peticion = start_xhr();
if(peticion){
peticion.overrideMimeType('text/xml');
peticion.open(method,url,false);
peticion.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
peticion.send(param);
funcion();
}
}
function unaFuncion(){
resp = req.responseText;
document.getElementById(ndiv).innerHTML = resp;
}
loadContent("http://url.es","GET","unaFuncion",null);
He puesto en negrita los cambios fundamentales. Para elegir entre sincrona y asincrona, tendremos que pasar como tercer parametro a la funcion open false o true respectivamente.
Y para la llamada a la funcion, dependiendo del modo se hara asignando el nombre de la funcion al atributo onreadystatechange o llamandola implicitamente dentro de la funcion.
Marcadores