Problème temps de retour avec XMLHttpRequest

cs_destiny Messages postés 249 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 29 août 2011 - 30 sept. 2008 à 16:29
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 - 1 oct. 2008 à 11:59
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

cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
1 oct. 2008 à 08:51
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]
0
cs_destiny Messages postés 249 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 29 août 2011
1 oct. 2008 à 10:15
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
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
1 oct. 2008 à 10:35
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]
0
cs_destiny Messages postés 249 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 29 août 2011
1 oct. 2008 à 11:40
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
0

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

Posez votre question
cs_destiny Messages postés 249 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 29 août 2011
1 oct. 2008 à 11:42
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
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
1 oct. 2008 à 11:59
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]
0
Rejoignez-nous