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] onreadystatechange outrepassé ?


Sujet :

JavaScript

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Par défaut [AJAX] onreadystatechange outrepassé ?
    Bonjour,

    Je développe une application (sur l'internet du web) et j'ai un petit soucis avec mes scripts Ajax.

    Mon application utilise pour la validation de tous ses formulaires un petit processeur de requête Ajax. Le formulaire balance une requête Ajax sur mes processeurs. Mes processeurs (scripts PHP) qui s'occupent de la réception et l'exécution de ces requêtes renvoient un peu de XML pour dire à mon script Ajax si tout s'est bien passé ou pour afficher une erreur.

    Mon script Ajax parse ensuite ce petit bout de XML et selon son contenu redirige vers une autre page ou affiche un message.

    Pour l'exemple, disons que le formulaire de login sur login.php appelle en Ajax process.php qui renvoit ce XML. Le javascript sur login.php va ensuite lire le XML dans le onreadystatechange et faire ce qu'il doit faire.

    Le problème est que dans certain cas au lieu de lire mon XML, l'explorateur quitte la page courante (login.php) et affiche la page de process (process.php). Du coup, mon utilisateur voit le XML que j'ai renvoyé et ne comprend pas ce qui lui arrive.

    J'ai un peu de peine à comprendre comment est-ce que mon explorateur peut passer outre le onreadystatechange. Peut être un problème d'asychronous ou synchronous ? Dans quel cas Ajax peut ouvrir la page qu'il l'appelle dans le _self au lieu de faire son processus en arrière-plan ?

    Je ne sais pas si tout est très clair mais je répondrais volontier à vos interrogations !

    Merci d'avance pour vos réponses

  2. #2
    Membre éclairé Avatar de jmulans
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 397
    Par défaut
    met nous le code parce que la j'en ai aucune idée

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Par défaut
    Il y a bcp trop de codes pour le copier ici mais je vais tenter de résumer.

    Mais avant tout, il me semble que le problème vient du onsubmit="" dans la balise form. Est-ce que c'est pleinement supporté sur tous les explorateurs de faire un "return false" pour abandonner le lancement du formulaire ?

    Parce qu'en gros l'objet Ajax ne devrait jamais s'occuper de faire une redirection dans l'explorateur, non ?

    Dans mon fichier login.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <form name="frm_login" method="post" action="/process.php" 
      onsubmit="return Process.formSubmit(this) ;">
     
      <input type="hidden" name="command" value="login"/>
     
     
      <input type="text" name="login"/>
      <input type="text" name="pwd"/>
    </form>
    Ca c'est mon fichier process.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    switch($_REQUEST['command']) {
      case 'login':
        ... génération du XML réponse ...
        break ;
    }
    Le XML renvoyé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <root>
      <response>true|false</response>
      <error/>
      <message/>
      <redirect/>
    </root>

    La méthode Process.formSubmit() fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var data = 'login=xxx&pwd=yyy' ;
     
    // xhReq est une instance de l'objet XMLHttpRequest
    xhReq.open('post', '/process.php', true) ;
     
    // je définis ma propre fonction de rafraichissement
    xhReq.onreadystatechange = Process.refresh ;
    xhReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=iso-8859-1"); 
    xhReq.send(data) ;
     
    return false ;

    Et voici ma fonction Process.refresh qui dans le cas problématique n'est jamais appelée :
    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
    if (xhReq.readyState == 4 && xhReq.status == 200)	{
      if (window.ActiveXObject)	{
        xmldoc = new ActiveXObject("Microsoft.XMLDOM");
        textXML = xhReq.responseText;
        xmldoc.async="false";
        if (!xmldoc.loadXML(textXML) )	{
          alert("Une erreur inconnue s'est produite durant le processus.") ;
        }
      } else	{
        xmldoc = xhReq.responseXML ;
      }
     
      // ... ensuite on traite les balises du XML ...
     
      redirect = xmldoc.getElementsByTagName('redirect').item(0) ;
      if (redirect && redirect.firstChild && redirect.firstChild.data) {
        location.href = redirect.firstChild.data ;
      }
     
      // ... etc ...
    }

  4. #4
    Membre éclairé Avatar de jmulans
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 397
    Par défaut
    essaye de virer "xhReq.status == 200"

Discussions similaires

  1. Comment ça marche ajax.onreadystatechange
    Par muppetshow dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 11/12/2009, 14h14
  2. [AJAX] Faire un return dans le onreadystatechange
    Par gelko dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/12/2006, 14h40
  3. [Ajax] question avec onreadystatechange
    Par lhulard dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/06/2006, 14h46
  4. Evenement onReadyStateChange
    Par Seth27 dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 12/05/2004, 12h15

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