Problème temps de retour avec XMLHttpRequest

Signaler
Messages postés
249
Date d'inscription
jeudi 17 février 2005
Statut
Membre
Dernière intervention
29 août 2011
-
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
-
Bonjour,

Avec XMLHttpRequest, j'effectue un traitement PHP assez conscéquent (environ 2/3s). Dans ma fonction ci-dessous, j'ai mis des tests qui normalement attente que la requete php soit terminé avant de passer les IF.

//Envoie des données
function sendData(method, url, data) {
  var xmlhttp = initXhrObj();

  if (!xmlhttp) return false;

    if(method == "GET") {
        if(data == 'null') {
            xmlhttp.open("GET", url, true); //ouverture asynchrone
        } else {
            xmlhttp.open("GET", url+"?"+data, true);
        }
       
      xmlhttp.send(null);
    } else if(method == "POST") {
        xmlhttp.open("POST", url, true); //ouverture asynchrone
        xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        xmlhttp.send(data);
       
    }
   
    if (xmlhttp) {
         xmlhttp.onreadystatechange=function() {        if (xmlhttp.readyState 4 && xmlhttp.status 200) {
                    if (xmlhttp.responseText ! = null) {
                    eval(xmlhttp.responseText);
                   
                    return true;
                }
            }
         }
    }
}

Donc voila ma question :Comment faire pour etre sur que la requete php soit belle est bien terminée avant d'eval la reponseText ?

Merci d'avance, bye

Web master RACE24H
http://www.exile.fr

6 réponses

Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
bonjour,
à priori ça doit baigner ce que tu fais....
je crois qu'il vaut mieux mettre la fonction avant le send.... mais bon....

 
xml.onreadystatechange=function()

      {   if ( xml.readyState == 4 )

          {   if ( xml.status == 200 )

              .... tout est ok, c'est reçu

 ...

 xml.open( post ou get , url, true );
...
 xml.send(paramètres);

ch'tiote remarque :

    eval(xmlhttp.responseText);
donc le php renvoie du javascript ET UNIQUEMENT du javascript
sinon, ça plante.
et pourquoi ne pas mettre ce javascript dans la page directement ?
ça éviterait au moins un échange avec le serveur et l'EVAL qui est très gourmand ...

CordialementBul[mon Site][M'écrire]
Messages postés
249
Date d'inscription
jeudi 17 février 2005
Statut
Membre
Dernière intervention
29 août 2011

Ben en faite,

Je vais vous expliquez ce que je fais pour un meilleur compréhension. J'ai un question a plusieurs étape. Suivant les reponses, les etapes peuvent être differentes (je ne pas stoker le formulaire en cache) et recharger la page a chaque étape est tros lent (tout le questionnaire est en base de données avec des contitions à eval, etc un truc de porc). C'est pourquoi grace au XMLHttpRequest, sans rechargement de page, je n'ai pas besion de recalculer les étapes deja saisie et recuperer uniquement l'étape que je vuex.

Je renvoie une variable avec le questionnaire de l'étape concerné en html. mais ya rien a faire, il passe dans l'eval avant meme que la génération php de la var js ne soit terminé.

Web master LFGTR - RACE24H
http://www.exile.fr
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
certes, certes.... et ajax est là pour ça
          ( communication js <=> serveur sans réafficher la page ! )

ma remarque était uniquement sur eval.... qui ne fonctionnera
     que si le php retourne du javascript, et uniquement du javascript
     pas de html ( ou alors il faut d'abord l'extraire
     regarde comment font ce qu'on appelle framework ou même GAG ici )
     généralement, rapatrier du js ne sert strictement à rien,
     il suffit de le mettre dans la page appelante. point barre.

de plus en plus d'ailleurs, on voit utiliser ajax pour réinventer une
    communication normale entre js et le serveur ( formulaire.... )
    c'est pas fait pour ça. ajax ne devrait en principe ne renvoyer
    que des données... qui seront réexploiter par javascript.

>>avec le questionnaire de l'étape concerné en html. mais ya rien a
faire,
>>il passe dans l'eval avant meme que la génération php de la var
js ne soit terminé.
je ne pense pas. je n'ai pas contrôler ta séquence, mais respecte mon exemple
ET SURTOUT PAS d'EVAL sur du HTML ! ça plante !
il faut du javascript pur !

CordialementBul[mon Site][M'écrire]
Messages postés
249
Date d'inscription
jeudi 17 février 2005
Statut
Membre
Dernière intervention
29 août 2011

Ben cet HTML est dans une variable javascript ! avec j'ai juste a faire ex :

document.getElementById('QuestionEtape' + genEtape).innerHTML = etapeInnerHTML;

*etapeInnerHTML = "
<table>.......
";

Bon j'ai réussit a contrôler cette erreur mais d'une facon un peu batarde ...

function nextEtape(nameForm) {
    var stringXmlHttpSend = "";
   
    if (!genEtape) {
        stringXmlHttpSend = getParamEtape(nameForm);
       
        urlSend = 'DevisV3_action.php?etape=' + DevisEtape + '&NumDevis=' + NumDevis + '&VersionDevis=' + VersionDevis + '&ElemDevis=' + ElemDevis + '&action=enrEtape&CdeEC=';
        sendData("POST", urlSend, stringXmlHttpSend);
       
        timer = setTimeout('nextEtape(\'' + nameForm + '\')', 500);
    } else {
        clearTimeout(timer);
       
        if (maxEtape <= genEtape) {
            alert("aucune etape suivante ! (recap ?)");
        } else {
            if (!etapeInnerHTML) {
                urlSend = 'DevisV3_action.php?etape=' + genEtape + '&NumDevis=' + NumDevis + '&VersionDevis=' + VersionDevis + '&ElemDevis=' + ElemDevis + '&action=etapteSuiv&CdeEC=';
                sendData("POST", urlSend, "");
               
                timer2 = setTimeout('nextEtape(\'' + nameForm + '\')', 1000);
           
            } else if (etapeInnerHTML && DevisEtape < genEtape) {
                clearTimeout(timer2);
               
                document.getElementById('QuestionEtape' + DevisEtape).style.display = "none";
                document.getElementById('QuestionEtape' + genEtape).innerHTML = etapeInnerHTML;
                document.getElementById('QuestionEtape' + genEtape).style.display = "block";
               
                DevisEtape = genEtape;
                genEtape = false;
                etapeInnerHTML = false;
               
                if (autoNextEtape) {
                    alert('autoNextEtape !');
                }
            }
        }
    }
    return true;
}

Cela fonctionne plutot sauf ... dommage que XMLHttpRequest n'est pas un peu plus de commandes a ce niveau de vérification

Encore merci Bultez pour ton aide !

Web master LFGTR - RACE24H
http://www.exile.fr
Messages postés
249
Date d'inscription
jeudi 17 février 2005
Statut
Membre
Dernière intervention
29 août 2011

Grace a des setTimeout, je m'en sort plutot bien car ca fonctionne mais ce n'est pas trés dynamique ...

Web master LFGTR - RACE24H
http://www.exile.fr
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
ton doit onreadystatechange = function()  être "mal fait",  ou pas là où il faut....

mais malgré tout essaye donc :

<script>
    var t1="alert('toto');"
    eval(t1);
    t1="<script>alert('toto');<\/script>";
    eval(t1);
</script>

Bul[mon Site][M'écrire]