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

AJAX Discussion :

[AJAX] Requête AJAX qui ne fonctionne pas


Sujet :

AJAX

  1. #1
    Membre confirmé Avatar de benoitB
    Profil pro
    Inscrit en
    Août 2002
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 78
    Par défaut [AJAX] Requête AJAX qui ne fonctionne pas
    Le fichier index.php :
    Code html : 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
    <html>
       <head>
          <title>a useful dashboard for XML files - @ <?php echo date("H:i:s"); ?></title>
             <basefont size="1" color="" face="Arial,Courrier" />
             <script type="text/javascript" src="./_serverDatation.js"></script>
             <script type="text/javascript"><!--
                function Update ()
                {
                   javascript:_serverDatation();
                   setTimeout('Update()', 901);
                }
             --></script>
       </head>
       <body onload='Update();'>
          <table width=100% cellpadding=0 cellspacing=0 >
             <tr>
                <td align='center' bgcolor='#7FC6BC'><div id='serverDatation' style='display:inline'></div></td>
             </tr>
          </table>
       </body>
    </html>

    Avec le fichier _serverDatation.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
    function _serverDatation ()
    {
       var xhr=null;
       if (window.XMLHttpRequest)
       {
          xhr = new XMLHttpRequest();
       }
       else if (window.ActiveXObject) 
       {
          xhr = new ActiveXObject("Microsoft.XMLHTTP");
       }
       xhr.onreadystatechange = function() { fillDatas(xhr); };
       xhr.open("GET", "./_serverDatation.php", true);
       xhr.send(null);
    }
     
    function fillDatas (xhr)
    {
       var docXML = xhr.responseXML;
       var items = docXML.getElementsByTagName("serverDatation");
       for( i=0 ; i<items.length ; i++ )
       {
          document.getElementById('serverDatation').innerHTML = items.item(i).firstChild.data;
       }
    }
    Et enfin le fichier _serverDatation.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    header('Content-Type: text/xml'); 
    echo "<?xml version=\"1.0\"?>\n";
    echo "<XmlDatas>\n";
    echo "<serverDatation>".date("H:i:s")."</serverDatation>\n";
    echo "</XmlDatas>\n";
    ?>


    Et cela ne fonctionne pas (ces trois fichiers sont dans le même répertoire).

    Par contre si je modifie fillDatas de _serverDatation.js comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function fillDatas (xhr)
    {
       var docXML = xhr.responseXML;
    //   var items = docXML.getElementsByTagName("serverDatation");
    //   for( i=0 ; i<items.length ; i++ )
    //   {
    //      document.getElementById('serverDatation').innerHTML = items.item(i).firstChild.data;
    //   }
       document.getElementById('serverDatation').innerHTML = 100*Math.random();
    }
    Ça fonctionne bien, j'ai bien un chiffre au hasard affiché toutes les secondes ou presque (901 ms).

    Une/des propositions SVP ?

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Il faut attendre que le xhr.readyState soit égal à 4 et que le xhr.status soit à 200 ou 0 pour avoir un résultat.

    A+.

  3. #3
    Membre confirmé Avatar de benoitB
    Profil pro
    Inscrit en
    Août 2002
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 78
    Par défaut On avance...
    Merci pour le conseil, voici les modifications :

    Le fichier _serverDatation.js devient :
    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
    function _serverDatation ()
    {
       var xhr=null;
       if (window.XMLHttpRequest)
       {
          xhr = new XMLHttpRequest();
       }
       else if (window.ActiveXObject) 
       {
          xhr = new ActiveXObject("Microsoft.XMLHTTP");
       }
       xhr.onreadystatechange = function()
       {
          if(xhr.readyState == 4)
          {
             if(xhr.status == 200)
             {
                fillDatas(xhr);
             }
          }
       };
       xhr.open("GET", "_serverDatation.xml", true);
       xhr.send(null);
    }
     
    function fillDatas (xhr)
    {
       var docXML = xhr.responseXML;
       var items = docXML.getElementsByTagName("serverDatation");
       for( i=0 ; i<items.length ; i++ )
       {
          document.getElementById('serverDatation').innerHTML = items.item(i).firstChild.data;
       }
    }
    Le fichier _serverDatation.xml est :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0"?>
    <XmlDatas>
       <serverDatation>5555555</serverDatation>
    </XmlDatas>

    Et tout fonctionne bien !


    Donc mon soucis vient du fichier _serverDatation.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    header('Content-Type: text/xml');
    echo "<?xml version=\"1.0\"?>\n";
    echo "<XmlDatas>\n";
    echo "<serverDatation>".date("H:i:s")."</serverDatation>\n";
    echo "</XmlDatas>\n";
    ?>

    Pour lequel les conditions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          if(xhr.readyState == 4)
          {
             if(xhr.status == 200)
    Ne sont jamais remplies.

    Une idée ?

  4. #4
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Essaie avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(xhr.readyState == 4)
          {
             if(xhr.status == 200 || xhr.status==0)
             {
                fillDatas(xhr);
             }else{
                alert ("Erreur :"+xhr.status+" : "+xhr.statusText)
             }
          }

  5. #5
    Membre confirmé Avatar de benoitB
    Profil pro
    Inscrit en
    Août 2002
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 78
    Par défaut
    J'ai mis un peu de débogage dans fillDatas().

    Ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function fillDatas (xhr)
    {
       var ladate = new Date();
       var datation = (ladate.getHours() < 10 ? "0" + ladate.getHours() : ladate.getHours()) + ":" + (ladate.getMinutes() < 10 ? "0" + ladate.getMinutes() : ladate.getMinutes()) + ":" + (ladate.getSeconds() < 10 ? "0" + ladate.getSeconds() : ladate.getSeconds());
       document.getElementById('serverDatation').innerHTML = "fillDatas - (Entrée @php)<br />" + datation + "<br />xhr.readyState='" + xhr.readyState + "'<br />xhr.status='" + xhr.status + "'";
     
       var docXML = xhr.responseXML;
       var items = docXML.getElementsByTagName("serverdatation");
       //for( i=0 ; i<items.length ; i++ )
       //{
          //document.getElementById('serverDatation').innerHTML = items.item(i).firstChild.data;
       //}
       document.getElementById('serverDatation').innerHTML = "fillDatas (Sortie @php)<br />" + datation + "<br />xhr.readyState='" + xhr.readyState + "'<br />xhr.status='" + xhr.status + "'";
    }
    Le texte affiché correspond à la première modification : ...fillDatas - (Entrée @php).... La fonction fillDatas n'est donc pas complètement exécutée.

    Fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function fillDatas (xhr)
    {
       var ladate = new Date();
       var datation = (ladate.getHours() < 10 ? "0" + ladate.getHours() : ladate.getHours()) + ":" + (ladate.getMinutes() < 10 ? "0" + ladate.getMinutes() : ladate.getMinutes()) + ":" + (ladate.getSeconds() < 10 ? "0" + ladate.getSeconds() : ladate.getSeconds());
       document.getElementById('serverDatation').innerHTML = "fillDatas - (Entrée @php)<br />" + datation + "<br />xhr.readyState='" + xhr.readyState + "'<br />xhr.status='" + xhr.status + "'";
     
       var docXML = xhr.responseXML;
       //var items = docXML.getElementsByTagName("serverdatation");
       //for( i=0 ; i<items.length ; i++ )
       //{
          //document.getElementById('serverDatation').innerHTML = items.item(i).firstChild.data;
       //}
       document.getElementById('serverDatation').innerHTML = "fillDatas (Sortie @php)<br />" + datation + "<br />xhr.readyState='" + xhr.readyState + "'<br />xhr.status='" + xhr.status + "'";
    }
    La mise en commentaire de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var items = docXML.getElementsByTagName("serverdatation");
    fait que le texte affiché correspond à la dernière ligne de fillDatas ... fillDatas (Sortie @php)... et donc que la fonction fillDatas est complètement exécutée.

  6. #6
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Attention
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "<serverDatation>".date("H:i:s")."</serverDatation>\n";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    docXML.getElementsByTagName("serverdatation");
    getElementsByTagName est sensible à la casse pour les XML (ce qui n'est pas le cas pour le HTML).

    A+.

  7. #7
    Membre confirmé Avatar de benoitB
    Profil pro
    Inscrit en
    Août 2002
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 78
    Par défaut
    le fichier _serverDatation.php est :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    header('Content-Type: text/xml');
    //session_start();
    echo '<?xml version="1.0"?>'."\n";
    echo "<xmldatas>\n";
    echo "<serverdatation>".date("H:i:s")."</serverdatation>\n";
    echo "</xmldatas>\n";
    ?>

    J'avais corrigé l'erreur de casse et cela ne fonctionne toujours pas.

    Cependant, même avec l'erreur de casse, la méthode fillDatas devrait se dérouler entièrement quitte à ce qu'aucun noeud serverDatation ne se trouve dans le XML retourné, non ?

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 202
    Par défaut
    Bonjour,
    as tu essayé de ne faire qu'un écho dans ton fichier PHP
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    header('Content-Type: text/xml; charset=UTF-8');
    $data  ='<?xml version="1.0" encoding="UTF-8" ?>';
    $data .='<xmldatas>';
    $data .='<serverdatation>'.date("H:i:s").'</serverdatation>';
    $data .='</xmldatas>';
    echo $data;
    ?>

  9. #9
    Membre confirmé Avatar de benoitB
    Profil pro
    Inscrit en
    Août 2002
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 78
    Par défaut Faisons le point.
    Merci pour le conseil.

    J'ai essayé et c'est pareil.

    Il me semble que ce qui est retourné n'est pas du XML. Voici les codes actuels :

    index.php :
    Code html : 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
    <html>
       <head>
          <title>a useful dashboard for LG3 XML files - @ <?php echo date("H:i:s"); ?></title>
          <basefont size="1" color="" face="Arial,Courrier" />
          <script type="text/javascript" src="./_serverDatation.js"></script>
          <script type="text/javascript"><!--
             function Update ()
             {
                javascript:_serverDatation();
                setTimeout('Update()', 3000);
             }
          --></script>
       </head>
       <body onload='Update();'>
             <table width=100% cellpadding=0 cellspacing=0 >
                <tr><td align='center' bgcolor='#7FC6BC'><div id='serverDatation' style='display:inline'></div></td></tr>
                <tr><td align='center' bgcolor='orange'><?php echo phpversion(); ?></td></tr>
             </table>
       </body>
    </html>

    _serverDatation.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
    function _serverDatation ()
    {
       var xhr=null;
       if (window.XMLHttpRequest)
       {
          xhr = new XMLHttpRequest();
       }
       else if (window.ActiveXObject) 
       {
          xhr = new ActiveXObject("Microsoft.XMLHTTP");
       }
       xhr.onreadystatechange = function()
       {
          if((xhr.readyState == 4) && (xhr.status == 200 || xhr.status==0) )
          {
             fillDatas(xhr);
          }
       };
       xhr.open("GET", "./_serverDatation.php", true);
       xhr.send(null);
    }
     
    function fillDatas (xhr)
    {
       var ladate = new Date();
       var datation = (ladate.getHours() < 10 ? "0" + ladate.getHours() : ladate.getHours()) + ":" + (ladate.getMinutes() < 10 ? "0" + ladate.getMinutes() : ladate.getMinutes()) + ":" + (ladate.getSeconds() < 10 ? "0" + ladate.getSeconds() : ladate.getSeconds());
       document.getElementById('serverDatation').innerHTML = "fillDatas - (Entrée @php)<br />" + datation + "<br />xhr.readyState='" + xhr.readyState + "'<br />xhr.status='" + xhr.status + "'";
     
       var docXML = xhr.responseXml;
       //var items = docXML.getElementsByTagName("serverdatation");
       //document.getElementById('serverDatation').innerHTML = "fillDatas (Inside @php)<br />Count='" + items.length + "'<br />" + datation + "<br />xhr.readyState='" + xhr.readyState + "'<br />xhr.status='" + xhr.status + "'";
       //for( i=0 ; i<items.length ; i++ )
       //{
          //document.getElementById('serverDatation').innerHTML = "fillDatas (Inside @php)<br />" + datation + "<br />xhr.readyState='" + xhr.readyState + "'<br />xhr.status='" + xhr.status + "'";
          //document.getElementById('serverDatation').innerHTML = items.item(i).firstChild.data;
       //}
       document.getElementById('serverDatation').innerHTML = "fillDatas (Sortie @php)<br />" + datation + "<br />xhr.readyState='" + xhr.readyState + "'<br />xhr.status='" + xhr.status + "'<br /><br /><br /><br />responseText='" + xhr.responseText + "'";
    }
    Et _serverDatation.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    header('Content-Type: text/xml; charset=UTF-8');
    $data  ='<?xml version="1.0" encoding="UTF-8" ?>';
    $data .='<xmldatas>';
    $data .='<serverdatation>'.date("H:i:s").' (cette datation vient bien du fichier _serverDatation.php)</serverdatation>';
    $data .='</xmldatas>';
    echo $data;
    ?>

    Ça fonctionne très bien, les deux datations sont rafraîchies toutes les 3 secondes :


    Mais si je décommente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var items = docXML.getElementsByTagName("serverdatation");
    Alors le texte de fin de la fonction fillDatas n'est plus affiché même si l'heure de la première ligne est rafraîchie toutes les 3 secondes :


    J'accède bien à xhr.responseText mais manifestement docXML.getElementsByTagName n'aime pas...

    Là je suis un peu perdu...
    Images attachées Images attachées   

  10. #10
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Attention,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var docXML = xhr.responseXml;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var docXML = xhr.responseXML;

Discussions similaires

  1. Ajax cross-domain qui ne fonctionne pas
    Par fanfouer dans le forum jQuery
    Réponses: 11
    Dernier message: 27/10/2013, 01h45
  2. [AJAX] Listes liées qui ne fonctionnent pas sous IE 8
    Par unapologetic dans le forum AJAX
    Réponses: 4
    Dernier message: 27/02/2013, 11h04
  3. Réponses: 9
    Dernier message: 06/04/2011, 17h13
  4. [AJAX] xmlhttprequest.send qui ne fonctionne pas avec une variable !
    Par hoaxpunk dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/03/2009, 18h17
  5. Jquery/AJAX function click qui ne fonctionne pas.
    Par prome dans le forum jQuery
    Réponses: 2
    Dernier message: 12/03/2009, 12h57

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