malik7934
Messages postés1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 2009
-
24 janv. 2009 à 09:47
Bul3
Messages postés4933Date d'inscriptionsamedi 1 juillet 2006StatutMembreDernière intervention 2 février 2015
-
24 janv. 2009 à 12:39
Hello,
J'ai un problème bizarroïde : j'ai une fonction de contrôle en Ajax "treatProb" sur un formulaire qui en cas de succès met "1" dans un champ hidden, "0" sinon.
Ce résultat est utilisé ensuite dans mon code. Mais voilà, on dirait que ma fonction ajax met à jour trop lentement le champ de contrôle ou que la suite du code va trop vite car systématiquement la suite du code s'exécute un instant avant la mise à jour du champ :
// PARTIE AJAX
function getHTTPObject() {
...
}
var http = getHTTPObject();
function treatProb (){
...
http.onreadystatechange = handleHttpResponse;
...
}
function handleHttpResponse() { if (ret !'1') document.getElementById(' controle ').value '0';
else document.getElementById('controle').value = '1';
...
}
// APPEL DANS MON CODE
treatProb ()
if (document.getElementById('controle').value ! = '1') alert("Problème.");
else alert('Ok!');
Si je clique sur mon bouton submit et que le contrôle en Ajax est un succès, j'ai droit à "Problème". Si je reclique sans rien modifier, c'est "Ok!"...
Tests à l'appui "alert("Problème.")" s'exécute avant que treatProb() ait mis à jour le champt "controle"...
Bul3
Messages postés4933Date d'inscriptionsamedi 1 juillet 2006StatutMembreDernière intervention 2 février 201516 24 janv. 2009 à 11:09
tel que tu nous décris ça semble devoir baigner
et ça ne le fais pas... difficile "sans voir"
quelques pistes :
__ retourner 0 ou 1 et tester responseText
__ j'utilise "toujours" le même style :
fonction ajax :
http.onreadystatechange = function()
{ if(http.readyState == 4)
{ on peut traiter la réponse http.responseText }
}
http.open("POST ou GET", "http://....", true);
http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
....
http.send("paramètres");
ah.... je viens de percuter !
treatProb(); if (document.getElementById('controle').value != '1') alert("Problème."); else alert('Ok!');"
en javascript, on n'attend pas la fin du fonction pour continuer !
c'est à dire on lance la fonction treatProb(); et immédiatement on continue
à l'instruction suivante
tu devrais faire comme dans mon exemple.
Bul3
Messages postés4933Date d'inscriptionsamedi 1 juillet 2006StatutMembreDernière intervention 2 février 201516 24 janv. 2009 à 10:24
bonjour,
http.onreadystatechange = handleHttpResponse;
ta requète est en asynchrone ?
oui : faut attendre que le readystate passe à 4
ajax envoi des infos ( avec readystate != 4 ) en cours de traitement
Cordialement[mon Site][M'écrire]Bul
malik7934
Messages postés1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 24 janv. 2009 à 10:33
Salut,
Pas sûr de comprendre ta réponse... quoi qu'il en soit il est à 4 :
function handleHttpResponse() {
if (http.readyState == 4) {
if (http.responseText.indexOf('invalid') == -1) {
var xmlDocument = http.responseXML;
var ret = xmlDocument.getElementsByTagName('rep').item(0).firstChild.data;
malik7934
Messages postés1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 24 janv. 2009 à 10:55
Re-
Effectivement, je ne voulais pas mettre trop de code et j'ai râpé l'important.
responseXML est bête comme chou. Il vaut par exemple : <rep>0</rep>
Je récupère ensuite le contenu du tag "rep", soit le 0, et le stocke dans controle ()
J'ai fait un alert, et il a bien la valeur attendue. Mon problème est clairement dû au fait que dans "
treatProb(); if (document.getElementById('controle').value != '1') alert("Problème."); else alert('Ok!');" ce qui suit treatProb() s'exécute avant que treatProb est pu stocker la valeur retour dans controle...
malik7934
Messages postés1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 24 janv. 2009 à 12:32
Salut,
Merci pour ta réponse.
Je ne savais pas que Javascript n'attendait pas la fin de l'exécution d'une fonction pour passer à la suite. Je trouve cela plutôt bizarre comme spécificité... anyway, j'ai suivi ton conseil et je m'en suis sorti, mais en utilisant une autre méthode que le stockage dans un champ "controle" car j'ai la nette impression que le problème d'exécution se répercute sur des bouts de codes tels que "http.onreadystatechange = function(){}".
Du coup, j'ai au final :
var isWorking = false;
var http = new XMLHttpRequest();
if (!isWorking && http) {
var v = document.getElementById('verif').value;
http.open("GET", "controle.php?v=" + escape(v), true);
http.onreadystatechange = function(){
if (http.readyState == 4) {
if (http.responseText.indexOf('invalid') == -1) {
var xmlDocument = http.responseXML;
var ret = xmlDocument.getElementsByTagName('rep').item(0).firstChild.data;
if (ret != '1'){
alert("Vous avez mal recopié le code de vérification.");
return false;
}
isWorking = false;
}
}
};
isWorking = true;
http.send(null);
}
Pas vraiment portable, mais au moins cela fonctionne
Bul3
Messages postés4933Date d'inscriptionsamedi 1 juillet 2006StatutMembreDernière intervention 2 février 201516 24 janv. 2009 à 12:39
>>
Je trouve cela plutôt bizarre comme spécificité...
s'il existait la possibilité de le faire sans siouxer...
je ne serais pas d'accord avec toi,
mais effectivement, ça peut poser des problèmes
au moins d'écriture