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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 13
    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 confirmé 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
    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 : 49

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    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 confirmé

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    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
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 13
    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 : 49

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    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
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 13
    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 : 49

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    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

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