IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[AJAX] Deroulement de script XMLHttpRequest différent sous IE et FF


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Points : 20
    Points
    20
    Par défaut [AJAX] Deroulement de script XMLHttpRequest différent sous IE et FF
    Bonjour,
    Je suis nouveau, donc toutes mes excuses si je ne suis pas assez clair ...
    Nota : je ne sais pas si mon problème releve seulement de JS ou d' AJAX

    Mon souci :
    J'ai fait une page qui fait appel à un script JS. Ce script JS utilise classiquement XMLHttpRequest pour obtenir une info du serveur (en POST et en asynchrone).
    Mais : le comportement de mon ensemble n'est pas le même sous IE et FF (anormal sous FF !) :
    Sous FF, la fonction semble ne vouloir finir qu'une fois le script principal terminé
    Sous IE, c'est un peu le contraire, il se fait les 4 appels déclenchés par l'état avant de sortir de ma fonction de maj_messages.

    Quelqu'un a-t-il une explication et surtout une solution (pour ma page complète, ça a une importance)
    Pour être plus clair sur le forum, j'ai tout simplifié au maximum
    NOTA pour ne pas être surpris : sous FF il faut "tuer" FF pour en sortir car on se retrouve bloqué dans la boucle finale

    Le fichier de base : page.html
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <html><head><script src="./test.js" type="text/javascript"></script></head>
    <body><div><p>Texte d'exemple</p></div></body></html>
    Le script JS : test.js
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    var $xhr_fini;
    function maj_messages() {
      xhr_object = null;
      if(window.XMLHttpRequest) // Firefox
        xhr_object = new XMLHttpRequest();
      else if(window.ActiveXObject) // Internet Explorer
        xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
      else { // XMLHttpRequest non supporté par le navigateur
        alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest ...");
        return;
      }
      $data = "information=aaa";
      xhr_object.open("POST","./test.php",true);
      xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      xhr_object.onreadystatechange = function anonymous() {
          alert('Le statut vient de changer : '+xhr_object.readyState); 
          if(xhr_object.readyState == 4) {
            alert('on est au bon statut : '+xhr_object.readyState); 
            var $reponse = xhr_object.responseText.split(":");
            var $informationautiliser = $reponse[0];
            if(typeof($informationautiliser) != "undefined") {
              alert("LA ON FAIT CE QUE JE VEUX FAIRE AVEC LE RETOUR DE MON PHP");
            }
            $xhr_fini = true;
          }
        }
      alert("Avant envoi des donnees");
      xhr_object.send($data);
      alert("Après envoi des donnees");
    }
    function demarrer() {
      $xhr_fini = false;
      maj_messages();
      while ($xhr_fini == false) {
        alert ("On est dans la boucle d'attente : "+$xhr_fini+" : "+xhr_object.readyState);
      }
      alert ("Fin de la fonction demarrer : "+$xhr_fini);
    }
    window.onload = demarrer;
    Le script php (sans interrêt) : test.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
      echo ">>>".$_POST['information'];
    ?>

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Bonjour,
    ne serait-ce pas juste ta variable xhr qui devrait être déclarée en globale (car utilisée dans plusieurs fonction) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var $xhr_fini;
    var xhr_object;
    function maj_messages() {
      xhr_object = null;
    ...
    A+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Points : 20
    Points
    20
    Par défaut
    J'ai essayé, ça ne change rien (de toutes façons, j'avais vérifié les questions de portée de variables)

    ... la suite de mon problème : j'ai supprimé ma fonction demarrer, pour essayer d'isoler le probleme ... et je tombe sur un truc de dingue : voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    <html><head>
    <script type="text/javascript">
     
    var $xhr_fini;
    var xhr_object;
    function demarrer() {
      $xhr_fini = false;
      //########### ancien appel à maj_messages();
      xhr_object = null;
      if(window.XMLHttpRequest) // Firefox
        xhr_object = new XMLHttpRequest();
      else if(window.ActiveXObject) // Internet Explorer
        xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
      else { // XMLHttpRequest non supporté par le navigateur
        alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest ...");
        return;
      }
      xhr_object.onreadystatechange = function anonyme()
        {
          alert('Le statut vient de changer : '+xhr_object.readyState);
          if(xhr_object.readyState == 4) {
            alert('on est au bon statut : '+xhr_object.readyState);
            var $reponse = xhr_object.responseText.split(":");
            var $informationautiliser = $reponse[0];
            if(typeof($informationautiliser) != "undefined") {
              alert("LA ON FAIT CE QUE JE VEUX FAIRE AVEC LE RETOUR DE MON PHP");
            }
            $xhr_fini = true;
          }
        }
      $data = "information=aaa&nocache="+Math.random();
      xhr_object.open("POST","./testtest.php",true);
      xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      alert("Avant envoi des donnees");
      xhr_object.send($data);
      alert("Apres envoi des donnees");
      alert ("Avant la fonction demarrer : "+$xhr_fini);
      $n=0 ;
      while (($xhr_fini == false) && ($n < 6)) {
        alert ("On est dans la boucle d'attente ("+$n+") : "+$xhr_fini+" : "+"xhr_object.readyState");
        $n++;
      }
    }
    window.onload = demarrer;
    </script>
    </head><body><div><p>Texte d'exemple</p></div></body></html>
    et là :
    - sous IE : il s'arrête carrément entre les deux alertes Après envoi et Avant la

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Points : 20
    Points
    20
    Par défaut
    Désolé, j'ai envoyé le message avant de l'avoir fini ... je continue :

    et là :
    - sous IE : il s'arrête carrément entre les deux alertes "Après envoi des donnees" et "Avant la fonction démarrer"
    - sous FF : il attend d'avoir fini tout le traitement "principal" pour s'occuper de l'évolution de xhr_object.readyState.

    J'ai l'impression d'être dans un mauvais rêve
    Est-ce que quelqu'un peut m'expliquer !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Points : 20
    Points
    20
    Par défaut
    Je n'aurai sans doute jamais de réponse à mes questions puisque quand j'utilise un appel "récursif" avec un setTimeout, tout se passe bien.
    Merci quand même de votre aide.
    PB

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] Emplacement du script
    Par Strab dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 07/06/2006, 16h07
  2. Réponses: 2
    Dernier message: 23/04/2006, 21h02
  3. [CSS]Affichage différent sous IE et FF
    Par arnaud_verlaine dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 08/12/2005, 13h53
  4. Menu vertical différent sous FF et IE
    Par Myogtha dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 06/12/2005, 00h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo