AJAX pose problème

Résolu/Fermé
jlemonde Messages postés 21 Date d'inscription dimanche 26 décembre 2010 Statut Membre Dernière intervention 12 avril 2013 - 3 janv. 2012 à 11:56
jlemonde Messages postés 21 Date d'inscription dimanche 26 décembre 2010 Statut Membre Dernière intervention 12 avril 2013 - 4 janv. 2012 à 10:08
Salut,
J'ai un problème bizarre: j'ai un code qui marche prèsque correctement, mais lorsque j'appelle la fonction AJAX('file.txt'), une erreur surgit :
Uncaught Error: INVALID_STATE_ERR: DOM Exception 11

Pourtant le fichier file.txt est correctement retourné !

Voici mon code :
   function getXMLHttpRequest(){
      var xhr = null;
   
      if(window.XMLHttpRequest || window.ActiveXObject){
         if(window.ActiveXObject){
            try{
               xhr = new ActiveXObject('Msxml2.XMLHTTP');
            }
            catch(e){
               xhr = new ActiveXObject('Microsoft.XMLHTTP');
            }
         }
         else{
            xhr = new XMLHttpRequest();
         }
      }
      else{
         alert('Votre navigateur ne supporte pas l\'objet XMLHttpRequest...');
         return null;
      }
      return xhr;
   }
   
   var AJAXMemory;
   function AJAX(file,callBack){
      var xhr = getXMLHttpRequest();
      xhr.onreadystatechange = function() {
         if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
            AJAXMemory = xhr.responseText;
            eval(callBack);
         }
         else{
            AJAXMemory = 'Erreur ' + xhr.status;
         }
      }
      xhr.open('GET', file, false);
      xhr.send(null);
      return AJAXMemory;
   }

// UTILISATION : mondiv.innerHTML = AJAX("fichier.txt","alert('callBack')")

Vous arrivez à m'expliquer pourquoi cette erreur vient me perturber, et ce qu'il me faut changer dans mon code ?

11 réponses

avion-f16 Messages postés 19249 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 15 juin 2024 4 503
3 janv. 2012 à 23:43
Le problème est créé par cette ligne :
AJAXMemory = 'Erreur ' + xhr.status;


Connaître le statut n'a pas vraiment d'intérêt lorsque la requête n'est pas terminée ...
1
Anoen Messages postés 196 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 11 septembre 2013 25
3 janv. 2012 à 12:51
Bonjour,

Sais-tu à quel moment précis dans la fonction AJAX il te renvoie cette erreur ?
0
jlemonde Messages postés 21 Date d'inscription dimanche 26 décembre 2010 Statut Membre Dernière intervention 12 avril 2013
3 janv. 2012 à 13:20
Non, pas tellement.
Je vais essayer de trouver...
0
jlemonde Messages postés 21 Date d'inscription dimanche 26 décembre 2010 Statut Membre Dernière intervention 12 avril 2013
3 janv. 2012 à 13:27
J'ai l'impression que c'est les fonction open() et send() car en les supprimant, il n'y a plus d'erreur. Mais évidement la fonction retourne undefined : elle ne fonctionne pas.
0

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

Posez votre question
Anoen Messages postés 196 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 11 septembre 2013 25
3 janv. 2012 à 13:42
Où est ton responseText ?
0
jlemonde Messages postés 21 Date d'inscription dimanche 26 décembre 2010 Statut Membre Dernière intervention 12 avril 2013
3 janv. 2012 à 13:54
   var AJAXMemory;
   function AJAX(file,callBack){
      var xhr = getXMLHttpRequest();
      xhr.onreadystatechange = function() {
         if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
            AJAXMemory = xhr.responseText; // Il est ici...
            eval(callBack);
         }
         else{
            AJAXMemory = 'Erreur ' + xhr.status;
         }
      }
      xhr.open('GET', file, false);
      xhr.send(null);
      return AJAXMemory;
   }
0
avion-f16 Messages postés 19249 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 15 juin 2024 4 503
3 janv. 2012 à 14:03
Salut,

UTILISATION : mondiv.innerHTML = AJAX("fichier.txt","alert('callBack')")

La fonction AJAX() ne retourne rien, elle ne fait qu'exécuté le callback.

Mais l'erreur ne provient pas de là.
Essaie en ajoutant quelques console.log() par-ci par-là.
Par exemple, au début du bloc « onreadystatechange » pour "loguer" les valeurs de xhr.status et xhr.readyState.
0
jlemonde Messages postés 21 Date d'inscription dimanche 26 décembre 2010 Statut Membre Dernière intervention 12 avril 2013
3 janv. 2012 à 14:27
Mais si, la fonction AJAX() retourne le contenu du fichier très bien.
À moins que tu n'aies pas mis la fonction « getXMLHttpRequest() »...

Tu dis qu'il faut loguer les valeurs de xhr.status et xhr.readyState, mais comment ??
0
Anoen Messages postés 196 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 11 septembre 2013 25
3 janv. 2012 à 14:31
console.log(xhr.status);
console.log(xhr.readyState);
0
avion-f16 Messages postés 19249 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 15 juin 2024 4 503
3 janv. 2012 à 14:34
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
    AJAXMemory = xhr.responseText; // Il est ici...
    eval(callBack);
}
Je ne vois aucun retour (return) en cas de succès.
Tu ne peux donc pas faire « qlqchose = laFonction(); », sinon, qlqchose vaudra « undefined ».
AJAXMemory contient bien le résultat, et est accessible par le callBack, mais c'est tout.

Et en général, le callBack, c'est une fonction et non une chaine qu'on exécute avec eval().

Exemple :
function affichage(resultat) {
    alert('Résultat = ' + resultat);
    // ou
    div.innerHTML = resultat;
}

function AJAX(cible, callback) {
    // Traitement

    callback(xhr.responseText);
}

AJAX('fichier.txt', affichage);
0
jlemonde Messages postés 21 Date d'inscription dimanche 26 décembre 2010 Statut Membre Dernière intervention 12 avril 2013
Modifié par jlemonde le 3/01/2012 à 14:41
oui d'accord, mais qu'est-ce qu'il faut que je regarde ??
console.log(xhr.status) retourne 200
console.log(xhr.readyState) retourne 4


le return se trouve quelques lignes plus bas.
D'abord je stocke le responseText dans une variable (AJAXMemory), et tout à la fin de la fonction AJAX(), je retourne la variable...
0
avion-f16 Messages postés 19249 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 15 juin 2024 4 503
3 janv. 2012 à 14:42
Je n'avais pas vu le « return AJAXMemory; » à la fin.
Mais il est mal placé, le return sera exécuté bien avant la fin de la requête XHR.
0
jlemonde Messages postés 21 Date d'inscription dimanche 26 décembre 2010 Statut Membre Dernière intervention 12 avril 2013
Modifié par jlemonde le 3/01/2012 à 14:50
C'est pourquoi j'ai décidé de faire fonctionner AJAX de manière syncrone :
xhr.open('GET', file, false);
c'est à dire que le script attend la fin de la requete avant de continuer.
0
avion-f16 Messages postés 19249 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 15 juin 2024 4 503
3 janv. 2012 à 17:20
Pourrais-tu mettre le code en ligne ?
0
jlemonde Messages postés 21 Date d'inscription dimanche 26 décembre 2010 Statut Membre Dernière intervention 12 avril 2013
3 janv. 2012 à 20:50
Je n'ai pas de vrai serveur en ligne... Je n'ai qu'esayPHP...
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
Modifié par Alain_42 le 3/01/2012 à 22:58
et comme ça:

  var AJAXMemory; 
   function AJAX(file,callBack){ 
      var xhr = getXMLHttpRequest(); 
      xhr.onreadystatechange = function() { 
         if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) { 
            AJAXMemory = xhr.responseText; 
            eval(callBack); 
         } 
         else{ 
            AJAXMemory = 'Erreur ' + xhr.status; 
         } 
    
   document.getElementById('id_de_mondiv').innerHTML = AJAXMemory; // 
      } 
      xhr.open('GET', file, false); 
      xhr.send(null); 
       
   }


et tu lances l'appel de la fonction AJAX (..

sur un événement
0
jlemonde Messages postés 21 Date d'inscription dimanche 26 décembre 2010 Statut Membre Dernière intervention 12 avril 2013
4 janv. 2012 à 10:08
Je veux une fonction qui me permette de retourner la contenu du fichier. Ta methode ne permet pas de faire ceci :
if(AJAX('file.txt') == 'exemple'){maFonction();}
0
jlemonde Messages postés 21 Date d'inscription dimanche 26 décembre 2010 Statut Membre Dernière intervention 12 avril 2013
4 janv. 2012 à 10:04
Merci avion-f16 !!
En modifiant AJAXMemory = 'Erreur ' + xhr.status; par AJAXMemory = 'Erreur ';, il n'y a plus d'erreur...
Mais pourquoi demander un xhr.status revoit-t-il une erreur ??
0