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] Ajax et temps réel => Erreur : xhr.responseXML has no properties


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 13
    Points : 8
    Points
    8
    Par défaut [AJAX] Ajax et temps réel => Erreur : xhr.responseXML has no properties
    Salut,

    j'ai une appli à faire fonctionnant en temps réel.
    C'est à dire qu'il a un script coté serveur donnant les infos en continu sur environ 1 minute.

    Voici comment je le simule:
    script "ajaxtr.php" ... avec un sleep( ) d'une seconde pour simuler le flot de données.

    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
     <?
    header('Content-Type: application/xml');
     
    echo  '<?xml version="1.0" encoding="ISO-8859-1"?>';
    echo '<reponse>';
     
    for ($n=0; $n<10;$n++)
    {
        echo '<line place="'.$n.'">line '.$n.'</line>';
        flush();
        sleep(1);
    }
     
    echo '</reponse>';
     
    ?>
    ce script tourne donc pendant 10 secondes.





    Ensuite coté client j'ai ce script et je voudrais visualiser les infos au fur et à mesure qu'elles arrivent

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     <html>
        <head>
            <title>Tutoriel Ajax (XHTML + JavaScript + XML)</title>
            <script type='text/JavaScript'>
                var xhr = null; 
     
                function getXhr(){
                    if(window.XMLHttpRequest) // Firefox et autres
                       xhr = new XMLHttpRequest(); 
                    else if(window.ActiveXObject){ // Internet Explorer 
                       try {
                                xhr = new ActiveXObject("Msxml2.XMLHTTP");
                            } catch (e) {
                                xhr = new ActiveXObject("Microsoft.XMLHTTP");
                            }
                    }
                    else { // XMLHttpRequest non supporté par le navigateur 
                       alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
                       xhr = false; 
                    } 
                }
     
                // Node cleaner
                function go(c){
                    if(!c.data.replace(/\s/g,''))
                        c.parentNode.removeChild(c);
                }
     
                function clean(d){
                    var bal=d.getElementsByTagName('*');
     
                    for(i=0;i<bal.length;i++){
                        a=bal[i].previousSibling;
                        if(a && a.nodeType==3)
                            go(a);
                        b=bal[i].nextSibling;
                        if(b && b.nodeType==3)
                            go(b);
                    }
                    return d;
                } 
     
                /**
                * Méthode qui sera appelée sur le click du bouton
                */
                function gophp(){
                    getXhr();
                    // On défini ce qu'on va faire quand on aura la réponse
                    xhr.onreadystatechange = function(){
     
                        // On ne fait quelque chose que si on a tout reçu et que le serveur est ok
                        document.getElementById("etatDiv").innerHTML = "Etat: " + xhr.readyState;
     
                        if(xhr.readyState >= 3)
                        {
                            document.getElementById("textDiv").innerHTML = "*";
                            reponse = clean(xhr.responseXML.documentElement);
     
                                                    document.getElementById("textDiv").innerHTML =  reponse.getElementsByTagName("line").length;
                        }
                    }
                    xhr.open("GET","ajaxtr.php",true);
                    xhr.send(null);
     
                }
            </script>
        </head>
        <body>
            <input type='button' value='TEST TR' onclick='gophp()'><br>
             <div id="textDiv"></div>
             <div id="etatDiv"></div>
        </body>
    </html>
    Mais j'ai cette erreur:
    Erreur : xhr.responseXML has no properties
    Fichier source : http://127.0.0.1/ajax/
    Ligne : 57

    Normalement avec if(xhr.readyState >= 3), on devrait pouvoir commencer à afficher les infos dès qu'elles commencent à arriver ?


    avez-vous une idée ?

    merci

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    En théorie surement mais en réalité non, tu ne peux pas obtenir la réponse tant que tu n'as pas "complete"

  3. #3
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    fais le dans firefox en ayant installé firebug comme extension.

    Tu pourras voir la réponse du serveur, y compris si ça vient d'un message d'erreur coté serveur

  4. #4
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par bclg
    Normalement avec if(xhr.readyState >= 3), on devrait pouvoir commencer à afficher les infos dès qu'elles commencent à arriver ?
    NON, de façon sure et certaine. Ne serait-ce que parceque pour créer un arbre DOM, il faut le document complet. Tu ne peux pas afficher au fur et à mesure.

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    C'est ce que je craignais un peu avec DOM.

    J'ai essayé la solution TXT ... avec la fonction "responseText"

    Script serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?
    for ($n=0; $n<10;$n++)
    {
        echo '<table border="1"><tr><td>'.$n.'</td><td>Description '.$n.'</td></tr></table>';
        flush();
        sleep(1);
    }
     
    ?>
    Script client

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    <html>
        <head>
            <title>Tutoriel Ajax (XHTML + JavaScript + XML)</title>
            <script type='text/JavaScript'>
                var xhr = null; 
     
                function getXhr(){
                    if(window.XMLHttpRequest) // Firefox et autres
                       xhr = new XMLHttpRequest(); 
                    else if(window.ActiveXObject){ // Internet Explorer 
                       try {
                                xhr = new ActiveXObject("Msxml2.XMLHTTP");
                            } catch (e) {
                                xhr = new ActiveXObject("Microsoft.XMLHTTP");
                            }
                    }
                    else { // XMLHttpRequest non supporté par le navigateur 
                       alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
                       xhr = false; 
                    } 
                }
     
                /**
                * Méthode qui sera appelée sur le click du bouton
                */
                function gophp(){
                    getXhr();
                    // On défini ce qu'on va faire quand on aura la réponse
                    xhr.onreadystatechange = function(){
     
                        // On ne fait quelque chose que si on a tout reçu et que le serveur est ok
                        document.getElementById("etatDiv").innerHTML = "Etat: " + xhr.readyState;
     
                        if(xhr.readyState >= 3)
                        {
     
                            document.getElementById("textDiv").innerHTML = xhr.responseText;
                        }
                    }
                    xhr.open("GET","ajax_txt_tr.php",true);
                    xhr.send(null);
     
                }
            </script>
        </head>
        <body>
            <input type='button' value='TEST TR' onclick='gophp()'><br>
     
            <table border="1">
                <tr><td colspan="3">ENTETE</td></tr>
     
                <tr>
                    <td valign="top">Col gauche</td>
     
                    <td>
                     <div id="textDiv"></div>
                     <div id="etatDiv"></div>
                    </td>
     
                    <td valign="top">Col droite</td>
     
             <tr><td colspan="3">PIED</td></tr>
             </table>
        </body>
    </html>
    ça fonctionne bien sous FireFox (la partie centrale de ma page se crée tout doucement alors que l'entourage de la page est déjà la entete+pied+colonnes gauche et droite
    ( je ne veux pas d'Iframe pour faire ceci )

    ... mais ça ne fonctionne pas sous IE
    la partie centrale arrive en 1 fois à la fin

    Erreur Javascript au moment ou j'accède à "xhr.responseText" ==> "Les données nécéssaires pour terminées cette opérations ne sont pas encore disponibles"

    y'a t-il une erreur dans mon code ?

    faut-il que je me tourne vers une autre solution que "XMLHttpRequest" ? si oui avez vous une idée ?

    merci

  6. #6
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    http://fr2.php.net/manual/fr/function.flush.php

    regardes les commentaires en dessous tu as des solutions pour ça

  7. #7
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    tu peux préciser STP ?

    lorsque je mets ceci dans le script serveur
    flush();
    sleep(1);
    c'est pour simuler ... en réalité je n'aurai pas de sleep( )

    j'ai essayé avec ceci avant le flush() , c'est pareil
    echo str_pad('',4096)."\n";

  8. #8
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    je peut pas te dire plus que de regarder les commentaires qu il y a en dessous sur la page que je t ai donné

    y a plusieurs methodes qui te montre comment faire pour ie.

    car visiblement, il attend un certain nombre de caracteres

  9. #9
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    le script serveur "http://127.0.0.1/ajax/ajax_txt_tr.php" lancé seul sous IE fonctionne bien ... la page se construit petit à petit.

    C'est le fait de le combiner à la fonction "responseText" de XMLHttpRequest qui ne va pas.
    Je souhaitais valider la faisabilité du principe et peut-être ce n'est tout simplement pas possible.

    Tous les exemples d'AJAX que j'ai pu voir ici et la fonctionnent avec les données complètement reçues. C'est à dire readyState = 4

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Solution ?
    Bonjour,
    J'ai exactement le meme problème avec IE, le responseText est indisponible jusqu'à l'atteinte du readyState==4, j'ai essayé d'nvoyer de plus gros paquets de données (2000 caracteres) en pensant que ça pouvait etre le cache d'IE mais ça ne regle en rien le pb.
    Ca marche sous Firefox par contre...
    Si tu as trouvé la soluce, ça m'intéresse
    Lightstreamer.com fournissent une soluce basée sur ce principe mais il on leur propre serveur...

  11. #11
    Membre habitué

    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 137
    Points : 161
    Points
    161
    Par défaut
    Exactement ce que j'ai testé aujourd'hui...

    Quelqu'un aurait une solution ? Elle doit bien exister puisque justement lightstreamer.com y parvient en Ajax...

Discussions similaires

  1. [AJAX] Script ajax, affichage en temps réel, IE8
    Par Saduina dans le forum AJAX
    Réponses: 1
    Dernier message: 26/12/2013, 15h22
  2. [AJAX] Erreur this.getNomsColonneCallbackSuccess has no properties
    Par Paci88 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 08/04/2008, 12h28
  3. [AJAX] "responseXML has no properties" sous Firefox
    Par Booyakha dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/06/2007, 17h18
  4. [AJAX] tableau en temps réel
    Par swissmade dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/05/2007, 14h36
  5. [AJAX] Modifications en temps réel.
    Par Bouarf77 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/08/2006, 15h27

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