Code s'exécutant "trop rapidement"

Résolu
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 - 24 janv. 2009 à 09:47
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Derniè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"...

Une idée ??

Merci d'avance,
Malik7934

8 réponses

Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
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.

Cordialement[mon Site][M'écrire]Bul
3
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
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
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
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;

            if (ret != '1'){
                  ....

Merci pour ton aide
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
24 janv. 2009 à 10:40
Correction : "if (http.responseXML.indexOf('invalid') == -1)" et pas "if (http.responseText.indexOf('invalid') == -1) ", mais ça ne change rien...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
24 janv. 2009 à 10:47
>>quoi qu'il en soit il est à 4 :
ah ben.. on ne le voyait pas ça.

>>var ret = xmlDocument.getElementsByTagName('rep').item(0).firstChild.data;
tu as fait un alert de ret ?  de responseXML ?
quoi qui n'y-a dedans ?

[mon Site][M'écrire]Bul
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
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...
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
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

Merci bien !
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
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


nickel si tout baigne
et merci du retour.

[mon Site][M'écrire]Bul
0
Rejoignez-nous