blatip
Messages postés4Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention25 octobre 2007
-
15 oct. 2007 à 22:38
blatip
Messages postés4Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention25 octobre 2007
-
25 oct. 2007 à 07:21
Bonjour,
Je suis nouveau, donc toutes mes excuses si je ne suis pas assez clair ...
Mon souci :
J'ai fait une page qui fait appel à un script JS
Ce script JS utilise classiquement XMLHttpRequest pour obtenir une info du serveur (en POST et en asynchrone)
Mais : le comportement de mon ensemble n'est pas le même sous IE et FF (anormal sous FF !) :
Sous FF, la fonction semble ne vouloir finir qu'une fois le script principal terminé
Quelqu'un a-t-il une explication et surtout une solution (pour ma page complète, ça a une importance)
Pour être plus clair sur le forum, j'ai tout simplifié au maximum
NOTA pour ne pas être surpris : sous FF il faut "tuer" FF pour en sortir car on se retrouve bloqué dans la boucle finale
Le fichier de base : page.html
<html><head><script src="./test.js" type="text/javascript"></script></head>
Texte d'exemple
</html>
Le script JS : test.js
var $xhr_fini;
function maj_messages() {
xhr_object = null;
if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest ...");
return;
}
$data = "information=aaa";
xhr_object.open("POST","./test.php",true);
xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr_object.onreadystatechange = function anonymous() {
alert('Le statut vient de changer : '+xhr_object.readyState);
if(xhr_object.readyState == 4) {
alert('on est au bon statut : '+xhr_object.readyState);
var $reponse = xhr_object.responseText.split(":");
var $informationautiliser = $reponse[0];
if(typeof($informationautiliser) != "undefined") {
alert("LA ON FAIT CE QUE JE VEUX FAIRE AVEC LE RETOUR DE MON PHP");
}
$xhr_fini = true;
}
}
alert("Avant envoi des donnees");
xhr_object.send($data);
alert("Après envoi des donnees");
}
function demarrer() {
$xhr_fini = false;
maj_messages();
while ($xhr_fini == false) {
alert ("On est dans la boucle d'attente : "+$xhr_fini+" : "+xhr_object.readyState);
}
alert ("Fin de la fonction demarrer : "+$xhr_fini);
}
window.onload = demarrer;
cs_bultez
Messages postés13615Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention15 octobre 201330 16 oct. 2007 à 09:43
Bonjour,
et pourtant... ça marche....
<html>
<head>
</head>
Texte d'exemple
<script type="text/javascript">
var $xhr_fini;
function maj_messages() {
xhr_object = null;
if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest ...");
return;
}
xhr_object.onreadystatechange = function()
{
//alert('Le statut vient de changer : '+xhr_object.readyState);
if(xhr_object.readyState == 4) {
//alert('on est au bon statut : '+xhr_object.readyState);
var $reponse = xhr_object.responseText.split(":");
var $informationautiliser = $reponse[0];
if(typeof($informationautiliser) != "undefined") {
alert("LA ON FAIT CE QUE JE VEUX FAIRE AVEC LE RETOUR DE MON PHP");
}
$xhr_fini = true;
}
}
$data = "information=aaa";
xhr_object.open("POST","./test.php",true);
xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
alert("Avant envoi des donnees");
xhr_object.send($data);
alert("Après envoi des donnees");
}
function demarrer() {
$xhr_fini = false;
maj_messages();
/*
while ($xhr_fini == false) {
alert ("On est dans la boucle d'attente : "+$xhr_fini+" : "+xhr_object.readyState);
}
alert ("Fin de la fonction demarrer : "+$xhr_fini);
*/
}
window.onload = demarrer;
blatip
Messages postés4Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention25 octobre 2007 17 oct. 2007 à 00:10
Oui, ça marche parce que tu as enlevé la boucle while.
Mais si tu laisses cette boucle :
- avec IE, ça marche, mais il ne sort de la fonction maj_messages qu'une fois le traitement complet (jusqu'à l'état 4) donc il passe tranquillement la boucle while puisque $xhr_fini est déjà true
- avec FF, il ne traite qu'une fois (etat 1) puis semble s'arrêter dans son traitement puisqu'il se retrouve bloqué dans la boucle while : l'état n'évolue plus et $xhr_fini reste false.
Nota : cette boucle while "représente" les autres traitements que j'aurai à faire en parallèle sur cette page (et qui seront eux aussi constitués de xmlHttpRequest) d'où pour moi l'importance d'être clair sur le traitement du script.
D'ailleurs, une question peut-être liée à mon problème : Javascript est-il sensé être traité en (pseudo-) parallèle (objet) ou de manière sequentielle (une chose après l'autre) ?
cs_bultez
Messages postés13615Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention15 octobre 201330 17 oct. 2007 à 08:39
en théorie javaScript est totalement asynchrone.
si tu appelles une function, ça l'appelle et continue en séquence.
>>FF se retrouve bloqué dans la boucle while
oui.
if(xhr_object.readyState == 4) { fait tes traitements ici, appels fonctions... }
<hr /> Cordialement Bul [mon Site] [M'écrire]<hr />
blatip
Messages postés4Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention25 octobre 2007 17 oct. 2007 à 21:06
Le traitement de l'info rendue par le php est bien fait dans cet appel quand xhr_object.readyState==4
Mais je veux pouvoir continuer d'autres choses en parallèle sans attendre le retour (c'est pour ça que je me suis mis en asynchrone), ce que je simule par ma boucle while.
Comme je l'ai dit, ce qui me choque vraiement, c'est que IE et FF n'ont pas le même comportement, et en plus que dans les deux cas, il n'est pas bon : normalement, à la fin de ma fonction maj_messages, lorsque les données sont envoyées, il devrait retourner à ma fonction principale demarrer, se bloquer dans la boucle while en attendant les 4 appels successifs jusqu'à xhr_object.readyState=4 et donc que xhr_fini passe à vrai, et qu'il puisse sortir de la boucle while !
Et ce n'est jamais ce qui se passe, ni pour IE ni pour FF ...
Au moins, est-ce que mon analyse est correste ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
blatip
Messages postés4Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention25 octobre 2007 25 oct. 2007 à 07:21
Je n'aurai sans doute jamais de réponse à mes questions puisque quand j'utilise un appel "récursif" avec un setTimeout, tout se passe bien.
Merci quand même de votre aide.
PB