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] innerHTML et <table>


Sujet :

JavaScript

  1. #1
    Membre chevronné
    Avatar de djayp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    295
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 295
    Par défaut [DOM] innerHTML et <table>
    Salut à tous !

    J'ai un souci avec innerHTML et internet explorer (normal vous me direz !) que je n'arrive pas à comprendre, ni à résoudre...

    Pour faire simple, imaginons que j'ai un tableau HTML dans lequel je souhaite ajouter des lignes lorsque je clique sur un bouton. J'appelle mon tableau titi, et je souhaite utiliser innerHTML pour l'ajouter des lignes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <script language="javascript" type="text/javascript">
    function ajout() {
     document.getElementById("titi").innerHTML += "<tr><td>ligne 2</td></tr>";
    }
    </script> 
     
    <table id="titi">
    <tr><td>ligne 1</td></tr>
    </table>
    <a href="javascript:ajout();">Ajouter une ligne</a>
    Aucun souci sous Firefox mais problème sous IE ! J'ai l'impression que IE n'aime pas que l'on insert du HTML dans un attribut <table> (à noter que si l'on remplace <table> par <div>, ça marche très bien !! bizarre...).

    Je sais que la solution serait possible avec DOM (d'ailleurs avec ce petit exemple ce serait facile) mais imaginer que mon tableau contienne non pas une colonne mais plusieurs avec à l'intérieur des champs de formulaires bien complexe...

    Bref, quelqu'un aurait une idée ?

    merci d'avance

  2. #2
    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

  3. #3
    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!


    Ha bin oui, avec IE, faut être verbeux, il aime ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function ajout()
    {
      var tobj = document.getElementById("titi");
      var tr = tobj.insertRow(tobj.rows.length);
      var td = tr.insertCell(tr.cells.length);
      td.innerHTML = "whatever you want man, you are free!"
    }
    Encore que si tu ne rajoutes pas de balise HTML à l'intérieur du <TD>, tu peux te contenter de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    td.innerText = "whatever you want man, you are free!"
    Voilà, ça devrait marcher.

    Yan
    Un kilomètre à pieds, ça use, ça use...

  4. #4
    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
    GOUPS

    sérieusement je vous déconseille d'utiliser innerHTML et autre truc du genre propres à IE.

    il y a un moyent simple de faire ça conforme au WC
    1) mettre un ID au tableau
    2) récupérer le tableau par son id dans le javascript
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mytable = document.getElementById('mytableid');
    et ensuite utiliser les methodes du dom pour ajouter des lignes au tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var row = document.createElement('tr');
    var container = document.createElement('td');
    var theData = document.createTextNode('mytext');
    container.appendChild(theData);
    row.appendChild(container);
    mytable .appendChild(row);
    c'est simple à mettre en oeuvre on peut éventuellement en faire une fonction et c'est 100% compatible

    A+JYT

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 116
    Par défaut
    Ca marche pas ton truc

  6. #6
    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
    Je vois que tu utilise IE
    donc dans IE tu ne peux pas avoir de <tr> dans une <table>

    lorsque tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <table><tr><td>2</td></tr></table>
    IE le transforme en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <table><tbody><tr><td>2</td></tr><tbody></table>
    lorsque j'ai donné l'exemple c'était sur le principe et je n'ais pas regardé les particularité de IE
    mon code n'était XHTML compliant. il faut en passer par le TBODY soit tu mets ton id sur ton tbody et le code que j'avais donné fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <table><tbody id="mytableid" /></table>
    <script >
    mytable = document.getElementById('mytableid');
    var row = document.createElement('tr');
    var container = document.createElement('td');
    var theData = document.createTextNode('mytext');
    container.appendChild(theData);
    row.appendChild(container);
    mytable .appendChild(row);
    </script>
    soi tu ajoute le tbody à la volée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <table id="mytableid" ></table>
    <script >
    mytable = document.getElementById('mytableid');
    var tbody = document.createElement('tbody');
    var row = document.createElement('tr');
    var container = document.createElement('td');
    var theData = document.createTextNode('mytext');
    container.appendChild(theData);
    row.appendChild(container);
    tbody .appendChild(row);
    mytable .appendChild(tbody);
    </script>
    bref si tu respecte la structure du XHTML tous les navigateur supportant le DOM interpréterons correctement ton code.

    lorsque tu utilise innerHtml le navigateur va lire le texte et l'envoyer au parser qui va détecter qu'il s'agit de html il vas alors interpréter chaque tag et tenter de construire la structure demandée. si le code n'est pas conforme au règle du xhtml il va faire des choix et ajouter les parties manquantes par exemple les tag non fermés. mais aussi ajouter les tag manquants ainsi lorsque tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById("titi").innerHTML += "<tr><td>ligne 2</td></tr>";
    en réalité tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById("titi").innerHTML += "<tbody><tr><td>ligne 2</td></tr></tbody>";
    Mais tu ne le vois pas.
    une fois le code lu et interprété le navigateur va instancier en memoire l'objet DOM corespondant. il va relier les objets entre eux et enfin attacher le tout à l'objet sur le quel on a fait le innerhtml après avoir supprimé tous les objets déjà présent.

    lorsque tu utilise les méthode du DOM c'est tois qui créé les objets les détache et les attache à ta guise. sans en passer par l'interprête html du navigateur.

    le revers de la médaille c'est qu'il te faut respecter la structure du document. ainsi si tu met un tag entre deux tr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (<tr><td>toto</td></tr><div>coucou</div><tr><td>toto</td></tr>)
    ça ne marchera pas et la valeur ne sera pas affiché. en passant par l'interprète tu ne sais pas ce que ça donnera mais ça passera. l'interprète html des navigateur est laxiste. cela lui permet d'afficher quelque chose même si la source n'est pas parfaite.

    A+JYT

Discussions similaires

  1. [DOM] innerHTML - Accès au contenu
    Par Heliodromel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/08/2007, 10h18
  2. [DOM] innerHTML value input firefox
    Par Teufboy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/08/2007, 10h07
  3. [DOM] InnerHTML & formulaire, perte des informations
    Par bambou dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 20/07/2007, 16h35
  4. [DOM] innerHTML, changement d'image, IE pas ok
    Par sunshine33 dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 05/07/2007, 01h25
  5. [DOM] InnerHTML, radioButton et Firefox
    Par jupit dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 10/04/2007, 20h49

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