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] racine.childNodes.length ne fonctionne pas avec résultat XML


Sujet :

AJAX

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 46
    Par défaut [AJAX] racine.childNodes.length ne fonctionne pas avec résultat XML
    Bonjour à tous,
    svp, pouvez-vous m'aider à comprendre pourquoi Je ne parviens pas à connaître le nombre de neuds retournés par le serveur dans une réponse XML?

    "racine.childNodes.length" ne fonctionne pas!

    Voici le fichier produit par le serveur PHP

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
     
    <groupe>
     
    <famille valeur=''1''>Famille 1</famille>
     
    <famille valeur=''2''>Famille 2</famille>
     
    <famille valeur=''3''>Famille 3</famille>
    </groupe>
    Voici mon script javascript qui refuse de fonctionner:

    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
     
    <script language="javascript"/>
     
    			function fnXhr(){
                                    var xhr = null; 
    				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; 
    				} 
                                    return xhr;
    			} //Fin fonction fnXhr()
    // Fonction appelée quand on clique sur un élément de la liste 1 
    // car il y a une seconde liste à charger
     
    			function fClient(){
    				var xhr = fnXhr();
     
    				// On définit ce qu'on va faire quand on aura la réponse
    				xhr.onreadystatechange = function(){
     
    				// Si le serveur est ok
    					if(xhr.readyState == 4 && xhr.status == 200){
    var reponse = xhr.responseXML;
     
    var racine = reponse.getElementsByTagName('groupe');
     
    var noeud = racine.childNodes;
     
    //Ce qui suit ne fonctionne pas!
    var nombreFils = racine.childNodes.length;
     
    alert(nombreFils);
     
    for(var i=0; i<nombreFils; i++){
    var leNeud = racine.childNodes[i];
     
    if(leNeud.nodeType == 1){
    alert(leNeud.firstChild.data);
    } //Fin if
     
    					}									 //Fin de la 
     
    boucle for
    } //Fin de l'action avec la réponse
     
    				// Les données sont envoyées en post
    				xhr.open("POST", "./ajax/clients.php", true);
     
    				xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
     
    				// On poste les données
    				// ici, l'id de la liste 1 nommée "classification"
    				liste1 = document.getElementById('classification');
    				id = liste1.options[liste1.selectedIndex].value;
     
    				xhr.send("id=" + id);
    				} //Fin fonction fClient()
    </script/>
    Merci d'avance

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Deux choses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <famille valeur=''1''>Famille 1</famille>
    c'est normal les quotes ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var racine = reponse.getElementsByTagName('groupe');
     
    var noeud = racine.childNodes;
    Un pluriel indique habituellement plusieurs éléments. Il faut donc préciser sur lequel tu veux travailler

    Essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var racine = reponse.getElementsByTagName('groupe')[0];
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 46
    Par défaut
    Salut,
    j'ai essayé ça et ça n'a rien donné! J'ai retiré l'attribut "valeur" pour le mettre en noeud, comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <groupe>
    <famille>
    <valeur>1</valeur>
    <nom>famille 1</nom>
    </famille>
     
    <famille>
    <valeur>2</valeur>
    <nom>famille 2</nom>
    </famille>
    </groupe>
    avec les lignes js suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var reponse = cleanXML(xhr.responseXML.documentElement);
     
    var racine = reponse.getElementsByTagName('groupe');
     
    var noeud = racine.getElementsByTagName('famille');
     
    var nombreFils = noeud.length;
    pas plus de résultat!

    Merci d'avance si vous pouvez me dépanner!

    No!

    Citation Envoyé par Bovino Voir le message
    Deux choses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <famille valeur=''1''>Famille 1</famille>
    c'est normal les quotes ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var racine = reponse.getElementsByTagName('groupe');
     
    var noeud = racine.childNodes;
    Un pluriel indique habituellement plusieurs éléments. Il faut donc préciser sur lequel tu veux travailler

    Essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var racine = reponse.getElementsByTagName('groupe')[0];

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    C'est normal à priori que ça ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var reponse = cleanXML(xhr.responseXML.documentElement);
     
    var racine = reponse.getElementsByTagName('groupe');
    documentElement renvoie une référence à l'élément racine du document XML (à condition aussi qu'il soit valide, vérifie ce point aussi).
    Donc ta variable reponse est une référence à la balise groupe, qui elle-même ne contient pas de balise groupe
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 46
    Par défaut
    Salut Bovino,
    je ne comprends pas ce que tu entends par :
    Donc ta variable reponse est une référence à la balise groupe, qui elle-même ne contient pas de balise groupe
    Pourtant, il y a bien une balise groupe
    qui contient la balise "famille", !
    Cette balise "famille" contient elle-même les balise "valeur" et "nom":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <valeur>...</valeur><nom>...</nom>
    .
    Expliques-moi mieux ce qui manque stp!

    Noël

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Par défaut
    <groupe> = documentElement

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 46
    Par défaut
    Salut Devyan,
    les deux lignes suivantes sont parfaitement identiques, et d'ailleurs, l'une ou l'autre ne provoque pas d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var racine = reponse.documentElement;
    est identique à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var racine = reponse.getElementsByTagName('groupe');
    .

    Mais là où les problèmes commencent, c'est sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var noeud = racine.getElementsByTagName('famille');
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var nombreFils = racine.childNodes.length;
    .
    Merci!

    Citation Envoyé par devyan Voir le message
    <groupe> = documentElement

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Par défaut
    Si cela ne fonctionne pas c'est que racine n'est à priori pas assigné donc reponse.getElementsByTagName('groupe') n'a pas trouvé de noeud groupe.

    Essaye d'afficher le contenu des objets à différents niveaux tu devrais obtenir des réponses...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 46
    Par défaut
    Citation Envoyé par devyan Voir le message
    Si cela ne fonctionne pas c'est que racine n'est à priori pas assigné donc reponse.getElementsByTagName('groupe') n'a pas trouvé de noeud groupe.
    Voici des résultats :

    [Je fais] --> [J'obtiens]

    alert(reponse.documentElement) --> null

    Mais:
    alert(reponse.getElementsByTagName('groupe')) --> object

    Est-ce que cela évoque quelque chose?

    Merci!

  10. #10
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par forumcpp_nono Voir le message
    Est-ce que cela évoque quelque chose?
    Ben oui... ce que devyan et moi essayons d'expliquer depuis le début

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(reponse.documentElement)
    est selon ton code, équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(xhr.responseXML.documentElement.documentElement)
    donc que cela te renvoie null n'a vraiment rien d'étonnant...
    Quant à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(reponse.getElementsByTagName('groupe'))
    sachant que {} est bien un objet, je ne suis pas non plus étonné.
    Si tu essayais maintenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(reponse.getElementsByTagName('famille'))
    Ah au passage, un objet ne possède pas de propriété length
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 46
    Par défaut
    Salut les gars,
    autant pour moi, on ne se comprenait pas parce que la première ligne de mon code (var reponse = cleanXML(xhr.responseXML.documentElement)) ne fonctionnant pas, je l'avais modifié sans le signaler dans mes posts en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var reponse = xhr.responseXML;
    Mais de toutes les façons, ce que je ne saisis pas, c'est que :
    alert(xhr.responseXML.documentElement) --> null (aussi)
    Pourtant :
    alert(xhr.responseText) --> document XML comme il faut, avec prologue, racine et corps, tout est comme je le souhaite en réponse texte! Mais le navigateur (IE) n'a pas l'air de comprendre lui, que c'est un doc XML.

    Je préfère donc, vous poser le problème autrement. Auriez-vous un exemple qui fonctionne bien sous IE, et qui permettrait :
    - à partir d'une première liste déroulante (lotissement) de choisir un lotissement sur lequel habitent des familles;

    - à partir du lotissement choisi, la liste des familles s'affichent dans une seconde liste déroulante;
    - sachant que tout cela doit passer par le serveur, je veux dire que je ne souhaite pas un code où les noms des lotissements (liste 1) sont écrits en dur dans le html.

    Puisque innerHTML ne fonctionne pas avec IE pour les listes déroulantes, je me suis lancé dans le XML qui ne donne pas plus de résultat pour ma liste, même si j'obtiens bien mon fichier XML normal en mode texte!

    Auriez-vous svp, un exemple à poster qui marcherait?
    vous seriez vraiment sympa car ça bloque vraiment mon programme!

    Merci d'avance!,

    Nono

    Citation Envoyé par Bovino Voir le message
    Ben oui... ce que devyan et moi essayons d'expliquer depuis le début

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(reponse.documentElement)
    est selon ton code, équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(xhr.responseXML.documentElement.documentElement)
    donc que cela te renvoie null n'a vraiment rien d'étonnant...
    Quant à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(reponse.getElementsByTagName('groupe'))
    sachant que {} est bien un objet, je ne suis pas non plus étonné.
    Si tu essayais maintenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(reponse.getElementsByTagName('famille'))
    Ah au passage, un objet ne possède pas de propriété length

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 46
    Par défaut
    bonjour,
    je me réponds à moi-même parce que j'ai pu résoudre le problème. Si quelqu'un se trouve coïncé par un problème de liste déroulante, voici ce que j'ai fait et qui marche bien:
    - Le serveur doit renvoyé un <select> complet (et non un XML):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <select name="désignation" id="désignation"/>
    <option value="valeur"/>Contenu</option/>
    ...
    </select/>
    - On dispose ensuite dans le corps du HTML un élément <div> vide à l'endroit où l'on souhaite insérer la liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <div class="IDDiv" id="IDDiv"/></div/>
    - Pui, dans le javascript, à l'endroit où on doit insérer l'action à effectuer, on ajoute juste cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    document.getElementsById('IDDiv').innerHTML = xhr.responseText;
    Les puristes diront que ce n'est pas vraiment de l'ajax parce qu'il n'y a pas de XML, mais au moins, ça marche et ouf!!!

    Noël

    Citation Envoyé par forumcpp_nono Voir le message
    Salut les gars,
    autant pour moi, on ne se comprenait pas parce que la première ligne de mon code (var reponse = cleanXML(xhr.responseXML.documentElement)) ne fonctionnant pas, je l'avais modifié sans le signaler dans mes posts en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var reponse = xhr.responseXML;
    Mais de toutes les façons, ce que je ne saisis pas, c'est que :
    alert(xhr.responseXML.documentElement) --> null (aussi)
    Pourtant :
    alert(xhr.responseText) --> document XML comme il faut, avec prologue, racine et corps, tout est comme je le souhaite en réponse texte! Mais le navigateur (IE) n'a pas l'air de comprendre lui, que c'est un doc XML.

    Je préfère donc, vous poser le problème autrement. Auriez-vous un exemple qui fonctionne bien sous IE, et qui permettrait :
    - à partir d'une première liste déroulante (lotissement) de choisir un lotissement sur lequel habitent des familles;

    - à partir du lotissement choisi, la liste des familles s'affichent dans une seconde liste déroulante;
    - sachant que tout cela doit passer par le serveur, je veux dire que je ne souhaite pas un code où les noms des lotissements (liste 1) sont écrits en dur dans le html.

    Puisque innerHTML ne fonctionne pas avec IE pour les listes déroulantes, je me suis lancé dans le XML qui ne donne pas plus de résultat pour ma liste, même si j'obtiens bien mon fichier XML normal en mode texte!

    Auriez-vous svp, un exemple à poster qui marcherait?
    vous seriez vraiment sympa car ça bloque vraiment mon programme!

    Merci d'avance!,

    Nono

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/03/2017, 21h52
  2. accesskey ne fonctionne pas avec un tabpanel avec ajax
    Par prady92 dans le forum ASP.NET Ajax
    Réponses: 0
    Dernier message: 27/04/2012, 18h28
  3. [AJAX] Filtre ne fonctionne pas avec IE
    Par beegees dans le forum AJAX
    Réponses: 2
    Dernier message: 12/05/2009, 10h32
  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. [AJAX] mon code ne fonctionne pas avec IE mais bien avec FF
    Par beegees dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/01/2009, 14h59

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