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] Pb getElementById avec IE


Sujet :

JavaScript

  1. #1
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 52
    Par défaut [DOM] Pb getElementById avec IE
    Bonjour à tous,
    j'ai un prioblème avec la méthode getElementById. Comme d'habitude tout fonctionne sous Firefox mais pas avec IE.
    J'ai donc un tableau définit comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <table summary="Tableau" class="backup" id="save">
    puis j'ai un bouton du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input name="but" type="button" value="pouet" onclick="javascript:displayorhide('champ','validate',1,'save')"></input>
    Ensuite dans un .js j'ai ma fonction displayorhide qui commence comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function displayorhide(id,button,num_but,tab_id)
    {
    	div = document.getElementById(id);
    	tab = document.getElementById(tab_id);
    	but = document.getElementsByName(button);
    .........
    }
    Après des tests avec des commentaires, c'est la ligne :
    tab = document.getElementById(tab_id);
    qui pose problème.
    Pourtant le premier getElementById() fonctionne très bien, même sous IE.

    J'ai également vérifié que je n'avait pas d'élément avec un name='save' car j'ai lu dans des précédents post que IE utilisait l'attribut name avec getElementById.
    J'ai aussi tenté de mettre un attribut name à mon tableau et d'utliser le premier élément retourné par getElementsByName(). Mais la encore sous IE j'ai le message d'erreur : "Cet objet ne gère pas cette propriété ou cette méthode."

  2. #2
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Salut,

    As-tu défini ton tableau en dynamique ? ( c'est à dire par un précédent innerHTML ? ou autre ? )

    getElementById fonctionne normalement bien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <html>
    <body>
      <table id="test">
        <tr>
          <td>
            <a href="javascript:alert(document.getElementById('test'))">test</a>
          </td>
        </tr>
      </table>
    </body>
    </html>

  3. #3
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 52
    Par défaut
    hum en effet, mon tableau est définit par un innerHTML.
    Est-ce que ça pose un problème à IE ? Je me disais que la fonction étant appelée après la création de la page cela ne devrait pas poser de problème. D'autant plus que cela marche sous Firefox.

  4. #4
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Chaque navigateur a sa propre implémentation du modèle DOM. Et dans le cas d'IE, innerHTML ne modifie pas l'arborescence DOM.

    Tu vas être obligé de jouer avec les nodes de DOM et ajouter ton élément à la main... Cf cet article.

    A+

  5. #5
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 52
    Par défaut
    merci pour ta réponse et pour le lien (très instructif). En fait je fait exactement la même chose que ce qui est dit dans la partie : "Whither innerHTML?"
    Je vais donc remplacer tout ça par des createElement et appendChild.
    Cependant, il y a encore un truc qui me dérange pour la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    but = document.getElementsByName(button);
    Cette ligne ne pose pas de problème (même sous IE) alors que le bouton qui est utilisé est créé dans le même innerHTML que mon tableau ?

  6. #6
    Membre Expert
    Avatar de ryan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 956
    Billets dans le blog
    1
    Par défaut
    Yop!

    Il y a bien des choses étranges avec getElementsByName...
    En voici un exemple:
    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
     
    <html>
    <head>
    <script type="text/javascript">
    function get_test()
    {
    var x=document.getElementsByName("test")
    alert(x.length + " elements")
    }
    </script>
    </head>
    <body>
    <div name="test"></div>
    <input name="test" type="text" <br>
    <input name="test" type="text" <br>
    <br>
    <input type="button" onclick="get_test()" value="combien de 'test'?">
    </body>
    </html>
    Ryan

  7. #7
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 52
    Par défaut
    en effet c'est très curieux on dirait qu'il ne prend que les derniers éléments de même type.

    En remplaçant mon innerHTML par des méthodes DOM j'obtiens encore le même type d'erreur sous IE (encore une fois ça marche bien sous FireFox).
    Voici le code :
    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
     
            tab=document.createElement("table"); 
    	tab.setAttribute("summary","Tableau");
    	tab.setAttribute("class","backup");
    	tab.setAttribute("id","save");
    	cap=document.createElement("caption")
    	text=document.createTextNode("Sauvegardes");
    	cap.appendChild(text);
    	tab.appendChild(cap);
    	row=document.createElement("tr");
    	row.setAttribute("class","title");
    	head=document.createElement("th");
    	text=document.createTextNode("Date Insertion");
    	head.appendChild(text);
    	row.appendChild(head);
    	head=document.createElement("th");
    	text=document.createTextNode("Nom");
    	head.appendChild(text);
    	row.appendChild(head);
            tab.appendChild(row);
    	container=document.getElementById("content");
    	container.appendChild(tab);
    Je suis loin d'avoir reconstruit tout mon tableau mais ça devrait au moins m'afficher mon caption et mes deux cellules d'en-têtes. Or j'ai toujours la même erreur sous IE : "Cet objet ne gère pas cette propriété ou cette méthode."

  8. #8
    Membre Expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Par défaut
    Citation Envoyé par ryan
    Yop!

    Il y a bien des choses étranges avec getElementsByName...
    En voici un exemple:
    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
     
    <html>
    <head>
    <script type="text/javascript">
    function get_test()
    {
    var x=document.getElementsByName("test")
    alert(x.length + " elements")
    }
    </script>
    </head>
    <body>
    <div name="test"></div>
    <input name="test" type="text" <br>
    <input name="test" type="text" <br>
    <br>
    <input type="button" onclick="get_test()" value="combien de 'test'?">
    </body>
    </html>
    Ryan
    Peut-être que si il n'y avait pas de faute dans ton HTML ca irait mieux...

  9. #9
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 52
    Par défaut
    je devrais peut-être préciser que tout ce code est généré par un script php qui est utilisé par un objet XmlHTTPRequest qui lui effectue un eval de ce qu'il reçoit.
    voilà je ne sais pas si ça a une incidence.

  10. #10
    Membre Expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Par défaut
    Plutot que de se casser la tête avec des Id, pourquoi ne pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function Button_onClick(btt) {
       var nd = btt
       while (nd.tagName!="td") {nd=nd.parentNode;}
       var tab = nd
       while (nd.tagName!="table") {nd=nd.parentNode;}
       var table = nd
       // [...]
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="button" onclick="Button_onClick(this)" />
    Je signalerais en passant que je ne suis pas sur qu'il soit prévu par W3C que les div aient des attributs name...

  11. #11
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 52
    Par défaut
    j'avoue ne pas trop comprendre ta réponse Frémy.
    Pour l'instant je cherche jsute à pouvoir créer un tableau à la volée de manière à pouvoir y accéder par la suite dans une fonction JS.
    Le bouton dont je parlais au début fait en fait partie de mon tableau et me permet de lancer une fonction JS.

    Mais bon pour le moment ce qui m'inquiète c'est que mon tableau ne s'affiche plus sous IE alors que ça marchait avec le innerHTML.

  12. #12
    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 658
    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 658
    Billets dans le blog
    1
    Par défaut
    pour préciser la pensée de fremy
    si tu ne fermes pas tes balise input ...

    <d
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    iv name="test"></div>
    <input name="test" type="text" /> <br>
    <input name="test" type="text"/> <br>
    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 !

  13. #13
    Membre Expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Par défaut
    oui. Je voulais aussi dire que l'ID n'était pas le seul moyen de récupérer un tableau...
    tu fais
    DivContent.innerHTML = XmlHttpRequest.responseText
    et puis, si tu veux récuperer tes objets, plutot que d'utiliser l'id, utilise le DOM !
    Ma petite fonction permet de retrouver le TABLE, le TD et la TR qui contient le button....
    C'était ca que tu faisait non ??

  14. #14
    Membre Expert
    Avatar de ryan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 956
    Billets dans le blog
    1
    Par défaut
    Yop!

    Citation Envoyé par FremyCompany
    Peut-être que si il n'y avait pas de faute dans ton HTML ca irait mieux...
    Voui voui, certes, je fus un peu distrait, mais même en corrigeant le > manquant dans les tags input, le résultat est 2, alors qu'on pourrait s'attendre à 3.

    Voici donc, pour la clarté du débat, le code corrigé:
    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
     
    <html>
    <head>
    <script type="text/javascript">
    function get_test()
    {
    var x=document.getElementsByName("test")
    alert(x.length + " elements!")
    }
    </script>
    </head>
    <body>
    <div name="test"></div>
    <input name="test" type="text" ><br>
    <input name="test" type="text" ><br>
    <br>
    <input type="button" onclick="get_test()" value="combien de 'test'?">
    </body>
    </html>

    Ryan
    Grand, blond, et avec un chaussure noire.

  15. #15
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 52
    Par défaut
    arf vi je suis d'accord SpaceFrog mais ce n'était pas de moi ce message.
    Sinon Fremy, je suis d'accord ta solution de récupération est meilleure.

    Cependant comme je le disais dans un précédent message j'ai maintenant un problème pour créer mon tableau avec les méthodes du DOM. En gros ça en marche pas sous IE (je commence à être habitué:-)).
    D'un autre coté je n'utilise ces méthodes que depuis une demi-heure donc il est possible que je ne fasse pas les choses correctement.
    Est-ce que ça vous semble correct ?
    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
    tab=document.createElement("table"); 
    	tab.setAttribute("summary","Tableau");
    	tab.setAttribute("class","backup");
    	tab.setAttribute("id","save");
    	cap=document.createElement("caption")
    	text=document.createTextNode("Sauvegardes");
    	cap.appendChild(text);
    	tab.appendChild(cap);
    	row=document.createElement("tr");
    	row.setAttribute("class","title");
    	head=document.createElement("th");
    	text=document.createTextNode("Date Insertion");
    	head.appendChild(text);
    	row.appendChild(head);
    	head=document.createElement("th");
    	text=document.createTextNode("Nom");
    	head.appendChild(text);
    	row.appendChild(head);
            tab.appendChild(row);
    	container=document.getElementById("content");
    	container.appendChild(tab);

  16. #16
    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 658
    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 658
    Billets dans le blog
    1
    Par défaut
    Non en fait simplement la balise div ne supporte pas la propriété name voilà tout ...
    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 !

  17. #17
    Membre Expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Par défaut
    SpaceFrog confirme donc ce que je pensais...
    Pour le code de création de table par DOM, je vois qqchose qui pourait être la source du pb...
    Pour attribuer un ID à un élément, utilser TAB.id="id" est préférable, si ce n'est même obligatoire...
    Ca pourrait peut-être arranger le pb...

  18. #18
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 52
    Par défaut
    apparemment le problème ne vient pas de là. Avec tab.id="save"
    j'obtiens le même résultat qu'avec setAttribute.

  19. #19
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    de quelle méthode parle l'erreur ?

  20. #20
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 52
    Par défaut
    le problème c'est que la ligne de l'erreur est la ligne à laquelle je fais l'eval() du responseText du XmlHTTPRequest. Ce qui est normal. En tant normal quand ça se produit j'arrive à debugger grâce à différents plugins de Firefox. Or là l'erreur ne se produit pas sur Firefox.
    Je suis désolé, je ne pourrais pas être plus précis car je ne suis plus devant le code.
    En tout cas d'après vous ça devrait marcher ?
    Sinon je vais essayer de me faire un petit exemple simple chez moi. Si ça marche ça voudra dire que l'erreur est ailleurs.

    Je laisse le post en non résolu encore un petit moment au cas où quelqu'un aurait quelque chose à ajouter.

    Merci à tous.

Discussions similaires

  1. [DOM][Java] Problème avec le retour de getNodeName()
    Par anutka dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 11/04/2012, 21h38
  2. [DOM] Problème bizarre avec DOM et XPath
    Par fragmonster dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 16/03/2006, 14h43
  3. [DOM] Créer <input> avec un type != "text"
    Par Mr N. dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/02/2006, 09h54
  4. [DOM] Validation xml avec PHP
    Par thefaycal dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 26/01/2006, 21h15
  5. [DOM] Données "utilisateur" avec les evenements DOM
    Par pedouille dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/12/2005, 17h07

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