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 :

[DOM] DOM, Incompatibilité Firefox IE getElementsByTagName


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 114
    Par défaut [DOM] DOM, Incompatibilité Firefox IE getElementsByTagName
    Bonjour !

    Voilà j'ai un petit problème en AJAX et en DOM.

    Je vais expliquer en bref ce que fait mon application.
    J'utilise des servlets JAVA pour aller chercher des enregistrements dans une base de données, ce servlet JAVA va me parser mes résultats en XML. Aucun problème jusque là. Ensuite dans une page JSP je récupère ces données dynamiquement grâce à un script Javascript avec le XMLHttpRequest. Toujours aucun problème jusque là. Le script va également mettre en page les enregistrements dans des tableaux, chaque ligne du tableau déclenche une autre action (une création d'une infobulle). Dans l'infobulle je met le détail complet des enregistrements "séléctionnés", sous Firefox ce script ne pose aucun problème mais sous IE non.


    Voici un aperçu du XML

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <TABLE>
     <ROW>
      <PRPRD.NUM FR="N°" show="true">1</PRPRD.NUM>
      <PRPRD.DES FR="Nom" show="true">TEST #1</PRPRD.DES>
      <PRPRD.OWC FR="Code" show="true">P1</PRPRD.OWC>
      <PRPRD.XDS FR="Description" show="true"/>
      <SAENT.COD FR="Code" show="false">TST</SAENT.COD>
      <WHPRD.PHQ FR="Quantité">140</WHPRD.PHQ>
      <PRICELIST FR="Prix" show="true">
       <PRICE show="true" SAEPLE.VAL="500.25" SAEPLE.QTY="1.0" SAEPLE.UNT="DFT" SAEPLE.FDT="2000-01-01" SAEPLE.TDT="2010-01-01"/>
      </PRICELIST>
     </ROW>
    </TABLE>
    Et voici la partie du code qui foire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function getContent(file,id,xhr)
    {
    	res = xhr.responseXML.getElementsByTagName("TABLE"); 
    	if(res != null)
    	{
    		rows = (res.item(0)).getElementsByTagName("ROW");
    		if(rows[0].length != 0)
    		{
    ...
    C'est cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rows = (res.item(0)).getElementsByTagName("ROW");
    Qui pose problème, pourtant j'ai essayé de cette façon aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rows = res[0].getElementsByTagName("ROW");
    Mais ça ne marche pas non plus.


    Est-ce que quelqu'un aurait une idée ?

    Merci

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salux

    Je sais pas si ça a un rapport, mais je suis pas sur que les points soient autorisés dans les balises xml (et les attributs)..
    Si c'est ça, peut etre que IE ne considere pas le document xml retourné comme valide et ne peut executer aucune requete dom

    Sinon, au lieu de recuperer les elements TABLE puis les elements ROW contenus dedans, j'aurais tendance à recuperer directement les elements ROW puisque TABLE est l'élement racine et il ne peut yen avoir qu'un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rows = xhr.responseXML.getElementsByTagName("ROW");

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 114
    Par défaut
    Pour ta première remarque (XML non valide) ça m'étonnerai puisque aussi bien IE que FF indiquent lorsqu'il y a des problèmes de syntaxe. De plus si mon XML n'était pas bien formé alors il afficherai pas le tableau (étant donné que c'est le même fichier XML).

    Pour ta deuxième remarque ce n'est pas possible car le fichier XML peut être "vide" alors dans ce cas là il va se former de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <TABLE>
      <NONE/>
      <URL>ShowReception.do</URL>
    </TABLE>
    (La balise <URL> est simplement pour me permettre une uniformité du code)


    Merci quand même

  4. #4
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Il suffirait dans ce cas de tester si "rows" est null au retour de getElementsByTagName ,)
    Mais ceci resoud pas ton pb dfaçons

  5. #5
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Citation Envoyé par thegreatbato
    Pour ta première remarque (XML non valide) ça m'étonnerai puisque aussi bien IE que FF indiquent lorsqu'il y a des problèmes de syntaxe. De plus si mon XML n'était pas bien formé alors il afficherai pas le tableau (étant donné que c'est le même fichier XML).
    Ce n'est pas tout à fait vrai : les navigateurs signalent bien les erreurs javascript, mais pas forcément les erreurs XML. Ce qui m'amène à ton autre remarque :
    Sous FF ça donne :
    [ObjectHTML Collection]
    1
    19

    Sous IE ça donne
    [object]
    0
    Sous IE7 + XP + fichier XML, getElementsByTagName() renvoie une HTMLCollection. Si tu obtiens juste un 'object', c'est que tu as un problème. Retour au point 1 : j'ai constaté sur une appli Ajax sur laquelle je travaille que Firefox était beaucoup plus tolérant aux XML invalides que IE. Je suis donc fortement tenté de penser que malgré tout, ton fichier XML n'est pas validé par IE.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 114
    Par défaut
    Hum oui tu as peut être raison,

    Voilà mon fichier XML que le serveur me retourne :

    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
    <?xml version='1.0' encoding='ISO-8859-1'?>
    <TABLE><ROW><TRCUS.TRD FR="N°" show="false">8</TRCUS.TRD>
    <TRTRD.NAM FR="Nom" show="true">HALL22</TRTRD.NAM>
    <GPLAN.DES FR="Langue" show="true">French</GPLAN.DES>
    <TRTRD.AD1 FR="Adr.1" show="true">Hall 22 S.A.</TRTRD.AD1>
    <TRTRD.AD2 FR="Adr.2" show="false"></TRTRD.AD2>
    <TRTRD.AD3 FR="Adr.3" show="false">Rue Pasquier Grenier 4</TRTRD.AD3>
    <TRTRD.AD4 FR="Adr.4" show="false"></TRTRD.AD4>
    <GPCTR.DES FR="Pays" show="true">Belgium</GPCTR.DES>
    <TRTRD.ZIP FR="C.P." show="true">7500</TRTRD.ZIP>
    <TRTRD.CIT FR="Ville" show="true">TOURNAI</TRTRD.CIT>
    <TRTRD.TEL FR="Tel." show="false"></TRTRD.TEL>
    <TRTRD.GSM FR="Gsm" show="false"></TRTRD.GSM>
    <TRTRD.FAX FR="Fax" show="false"></TRTRD.FAX>
    <TRTRD.EML FR="E-mail" show="false"></TRTRD.EML>
    <TRTRD.WBS FR="Website" show="false"></TRTRD.WBS>
    <TRTRD.FNM FR="Nom" show="true"></TRTRD.FNM>
    <TRTRD.LNM FR="Prénom" show="true"></TRTRD.LNM>
    <TRTRD.BRD FR="Date de n." show="false">2000-01-01</TRTRD.BRD>
    <TRTRD.CRD FR="Création" show="false">2007-01-01</TRTRD.CRD>
    </ROW>
    <URL>ShowStock.do</URL>
    </TABLE>
    Les retours a la ligne ne sont pas a prendre en compte, je les ai mis juste pour que ça sois plus clair.

    Peut-être est-ce le fait que je mette des . dans les description des balises, mais là encore je comprends pas pourquoi la création de la table marche mais pas l'infobulle, c'est le même objet XML qui est appellé ...

    Merci

  7. #7
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Citation Envoyé par thegreatbato
    Peut-être est-ce le fait que je mette des . dans les description des balises, mais là encore je comprends pas pourquoi la création de la table marche mais pas l'infobulle, c'est le même objet XML qui est appellé ...
    En effet, c'est incohérent. Si IE a un problème avec ton XML, il doit l'avoir dès le début. Cela dit :
    1 - j'ai dit des conneries IE7 récupère un "object" et non pas un HTMLCollection (trop de navigateurs ouverts sur mon bureau, j'ai pas appuyé sur le bon bouton... )
    2 - ton fichier XML est bien valide. Je viens de vérifier sous XMLSpy
    Donc j'ai tort.

    Hum... Je sais que le getElementsByTagName() marche sous IE, de même que les appels par item() et operator[] car j'ai plein de code avec ça sous la main. En fait, ton souci vient de ce que sous IE ton nodeList a été vidé de ses noeuds ou remplacé par autre chose. Avec un simple type 'object', difficile à savoir.

    Que se passe t'il entre la création de ta table (qui marche) et l'écriture des infobulles (qui ne marche pas) ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 114
    Par défaut
    Non effectivement !

    Mais merci de t'inquièter de l'optimisation de mon application


    Personne d'autre n'aurai une idée ??

  9. #9
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    hello

    quand tu dis que ça ne marche pas, c'est que tu as débuggé le script et remarqué que row est null, ou c'est parce que le traitement du if ne se fait pas ?

    si c'est le 2è cas alors c'est à cause de la condition qui est incorrecte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(rows[0].length != 0)
    alors qu'il faut
    non ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 114
    Par défaut
    Juste pour le test j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function getContent(file,id,xhr)
    {
    	rows = xhr.responseXML.getElementsByTagName("ROW"); 
    	if(rows != null)
    	{
    		Content = '<table border="0" cellpadding="0" cellspacing="0">';
                    alert(rows);
    		alert(rows.length);
    		alert(rows[0].childNodes.length);
    ...

    Sous FF ça donne :

    [ObjectHTML Collection]
    1
    19

    Sous IE ça donne

    [object]
    0

    Et puis une erreur : Objet requis




    C'est vraiment la mierda ces problèmes de compatibilité !

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 114
    Par défaut
    Personne ?

    La fonction DOM pour récupérer l'élément est quand même NodeList.item(i)

    Pourquoi ça fonctionne sur FF et pas IE ?

    Merci

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 114
    Par défaut
    Personne n'a vraiment aucune solution ? S'il vous plait !

  13. #13
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    dasn les contributions il y a une bibliothèque pour la gestion des balises XML avec DOM ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 114
    Par défaut
    http://www.developpez.net/forums/sho...&highlight=dom


    Utilser l'objet IXmlDom. Référez vous à la documentation et au code de l'objet.

    C'est ça qui est susceptible de savoir m'aider ?

    Parce que si c'est ça alors je sais pas ce que c'est qu'un objet IXMLDom. J'ai cherché et ils en parlent dans la msdn mais je comprends pas comment l'utiliser.

  15. #15
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    Citation Envoyé par thegreatbato
    Bonjour !

    ...
    Et voici la partie du code qui foire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function getContent(file,id,xhr)
    {
    	res = xhr.responseXML.getElementsByTagName("TABLE"); 
    	if(res != null)
    	{
    		rows = (res.item(0)).getElementsByTagName("ROW");
    		if(rows[0].length != 0)
    		{
    ...
    pourquoi (res.item(0)) ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function getContent(file,id,xhr)
    {
    	res = xhr.responseXML; 
    	if(res != null)
    	{
    		rows = res.getElementsByTagName("ROW");
    		if(rows.length != 0)
                    {
    		        if(rows[0].length != 0)
    		        {
    ...
    je comprends pas bien pourquoi tu mets des indice partout
    A+JYT

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 114
    Par défaut
    Parce que res.getElementsByTagName("ROW") renvoye un objet NodeList (qui si j'ai bien compris est un tableau) et pour accèder a ces éléments du tableau il faut utiliser des indices, j'ai vu qu'il existai également la méthode item de l'objet NodeList pour faire la même chose

    tout ça si j'ai bien compris hein

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 114
    Par défaut
    Up.

    Est-ce correct ce que j'ai marqué ? Toujours personne qui sais me répondre ?

  18. #18
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    ma question est pourquoi tu fait un get de table que tu prends le premier résultat pour faire un get des row ?

    alors qu'un get des row sur le xml te retourne la liste des row
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    res = xhr.responseXML.getElementsByTagName("TABLE"); 
    	if(res != null) ....
    alors que tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rows = xhr.responseXML.getElementsByTagName("ROW");
    la différence c'est que tu cherche toutes les tables et les row de la première
    alors que la deuxième solution retourne tous les rows du document xml

    attention getElementsByXXXX ne retourne pas un array mais une collection
    ça y ressemble mais ce n'est pas la même chose

    A+JYT

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 114
    Par défaut
    J'avai déjà répondu a cette question.

    Il est possible que il n'y ai pas d'élément table, a la place il peut y avoir un noeud none si il y a aucun résultat.



    Je suis sur le point de trouver le problème je pense !!
    Effectivement j'ai utilisé la propriété BaseURI d'un node, cette propriété est disponible seulement sous FF donc je pense que c'est ça.


    Je mettrai résolu si c'est ça.


    Merci a tout le monde pour votre aide !

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 114
    Par défaut
    Yeah youpi c'est résolu !

    Je suis vraiment un boulet ... désolé de vous avoir fait perdre du temps pour ça ...

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

Discussions similaires

  1. [DOM] Incompatibilité Firefox IE getElementsByTagName (SUITE)
    Par dr.krusty dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 22/02/2010, 13h59
  2. [DOM] Longueur 0 retournée par getElementsByTagName !
    Par DidRocks dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 10/11/2007, 13h13
  3. [DOM] Javascript et firefox
    Par Empty_body dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 28/07/2007, 08h25
  4. [DOM] compatibilité IE, FireFox
    Par metalpetsFR dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 18/04/2006, 11h16
  5. [DOM] DOM xml firefox et ie
    Par topolino dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 11/01/2006, 22h12

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