2 fonctions ajax sur un onchange

Résolu/Fermé
vero - 30 avril 2009 à 14:31
 vero - 30 avril 2009 à 15:51
Bonjour,

Je souhaite actualiser 2 listes déroulantes à partir d'une autre liste.

Pour cela, j'ai une fonction ajax, qui prend en parametres le nom de la page dans laquelle on recupere les infos de la liste actualisée, le nom de la premiere zone de liste et le nom de la div dans laquelle la liste actualisée apparaitra.

si je met un alert dans la fonction ajax, tout marche tres bien.
Si j'enleve le alert, il n'actualise qu'une seule des listes. a priori, ce serait du a un probleme de temps...

Quelqu un pourrait il m'aider?

Voici le code de la fonction ajax :
<script language="JavaScript">
var httpRequest;
function recup_data(div, reponse)
{
if ( document.getElementById )
{
document.getElementById( div ).innerHTML = reponse;
}
else
{
if ( document.layers )
{
document.div.innerHTML = reponse;
}
else
{
document.all.div.innerHTML = reponse;
}
}

}



function synchro_lst(deuxieme_page,zl,div)
{
// alert("avec ce alert tt marche tres bien !!!");
if (window.XMLHttpRequest)
{ // Mozilla, Safari, ...
httpRequest = new XMLHttpRequest();
if (httpRequest.overrideMimeType)
{
httpRequest.overrideMimeType('text/xml');
}
}
else
{
if (window.ActiveXObject)
{ // IE
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
}
var num = document.frm[""+zl+""].value

httpRequest.onreadystatechange = function()
{
if( httpRequest.readyState == 4 && httpRequest.status == 200 )
{
recup_data( div , httpRequest.responseText );
}
}

httpRequest.open("GET", deuxieme_page + "?num="+num, true);
httpRequest.send(null);
}
</script>

merci beaucoup,
Véro

2 réponses

Mimiste Messages postés 1149 Date d'inscription samedi 17 mai 2008 Statut Membre Dernière intervention 6 mars 2016 206
30 avril 2009 à 15:28
Alors essai de passer en mode synchrone

httpRequest.open("GET", deuxieme_page + "?num="+num, false);

avec le false comme 3eme parametre

Je pense que dans le onchange tu lance deux fois la fonction qui lance 2 requetes ajax simultanement ?
Du coup en mode synchrone il va bloquer l'execution du code tant qu'il n'a pas reçu de reponse de la part du serveur et executer les requetes une apres l'autre.

Et a mon avis c'est tout a fait normal car ta valeur "var httpRequest;" est déclarée de maniere globale. Ce qu'il ce passe c'est qu'il lance une premiere fois la fonction ajax qui ce sert de cette variable puis il la relance desuite après ce qui ecrase son contenu avant que le serveur ai repondu. (je sais pas si c'est clair ^^)
1
Merci énormément Mimiste c'est tout à fait ce que l'on cherchait avec Véro. On avait vraiment tou essayé suel cette petite condition.

Merci mille fois. ça fait vraiment plaisir !!!!
0
Un grand merci!!!
0
Mimiste Messages postés 1149 Date d'inscription samedi 17 mai 2008 Statut Membre Dernière intervention 6 mars 2016 206
30 avril 2009 à 15:12
salut

c'est etonnant ça voudrais dire que quand tu passe ici

if( httpRequest.readyState == 4 && httpRequest.status == 200 )
{
recup_data( div , httpRequest.responseText );
}

à mon avis readyState est à 4 mais le status n'est pas bon ou pas mis a jour ?

tu devrais peut etre essayer de separer le if et poser des alert pour etre sur de ce qu'il fait

if( httpRequest.readyState == 4)
{
if (httpRequest.status == 200 )
{
recup_data( div , httpRequest.responseText );
} else {
alert ("erreur : " + httpRequest.status);
}
}

0
merci pour ta reponse.

il passe bien dans la condition 'if (httpRequest.status == 200 ) '
Je n'ai en effet pas le message d'alert 'alert ("erreur : " + httpRequest.status);'.

En plus, si je met un message d'alert dans le if, il y passe bien.
0