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] IE supprime les "\n " avec innerHTML


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 12
    Points : 7
    Points
    7
    Par défaut [DOM] IE supprime les "\n " avec innerHTML
    bonjour,
    J'ai un tableau qui contient des données avec (parfois) des retour à la ligne
    Pour ne pas que les lignes de celui ci s'agrandissent, j'ai formaté le cellules avec le Css suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     td {
      overflow:hidden;
      white-space:nowrap;
     }
    Pour que l'utilisateur puisse voir le contenu complet (avec les retours à la lignes), j'ai un div avec le Css suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #IdCommentaire{
      white-space:pre; /* indique de prendre le formatage tel quel avec retours à la ligne tabulations etc)*/
    }
    et une fonction qui affiche dans ce div le contenu de la cellule sur mouseover via la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        function show_comment(event) {
          var elt_div = $('IdCommentaire');
          // on récupère qui est à l'origine du show comment
          var elt_td = Event.element(event)
          if (elt_div) {
              elt_div.innerHTML=elt_td.innerHTML
            //elt_div.innerHTML=elt_td.innerHTML.replace('\n','|');
            //elt_div.innerHTML=elt_td.firstChild.nodeValue.replace('\n','|');
          }     
        }
    tout ceci marche à merveille sur firefox, mais sur IE aucun retour a la ligne.
    Après vérifications le css "white-space:pre;" n'est valable sous IE qu'en mode csscompat (et pas quirks), ce que j'ai pu vérifier sur un cas plus simple.
    Mais le pb ne vient pas de là (j'ai essayé aussi de mettre le contenu du div dans une balise <PRE></PRE> sans plus de succès.
    En fait, il semble que dès qu'on fait une "copie" d'un élément, IE supprime automatiquement les retours à la ligne (ce que j'ai pu vérifier avec les 2 lignes en commentaires (ou je transforme le '\n' en '|' )--> sous Firefox je vois les | sous IE ...aucun '|' ni '\n'

    Au cas où ce serait le innerHTML qui poserait probleme J'ai tenté aussi un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
           cloneNode = elt_td.cloneNode(true);
            elt_div.innerHTML="";
            elt_div.appendChild(cloneNode);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elt_div.innerHTML=elt_td.firstChild.nodeValue;
    Sans plus de succès


    Est ce que quelqu'un à une idée, soit de ce qui ne va pas dans mon code soit de comment contourner le pb (en dehors de mettre des <BR> lors de la génération du contenu de la cellule car je ne veux pas que les retours à la lignes soit présent dans le tableau initial. Je ne peux/veux pas non plus gérer 2 versions de chaque cellule une avec <BR> et une sans <BR> car j'ai le "pb" sur toutes les cellules d'un tableau qui peut être grand


    Merci pour toute aide...

  2. #2
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    aurais tu un exemple un peu plus complet ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Est ce que ceci permet de mieux cerner ?
    Désolé j'ai simplifié mon code qui utilise prototype mais quelques modifs pourraien t permettre de s'en passer. (je n'ai pas fait les modifs en question de peur d'introduire des bugs mais a priori, prototype n'est pas en cause).

    Avec le code suivant, j'ai un résultat Ok sous Mozilla (le div affiche la cellule avec les retours a la ligne) et Ko sous IE6 (tout en ligne sans retours):
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
     
    <html>
    <head>
      <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    <title>Exemple</title>
     
    <style type="text/css">
    thead, tfoot {
      text-align: center;
    }
     
    #table1{
      table-layout: fixed; /* la tableau prend la taille définie et ignore le contenu*/
      width: 100px; /* le table layout ne marche pas sous Mozilla si on ne met pas de taille (même 1px suffit)
          on peut mettre en pourcentage aussi*/
    }
     
     td {
      white-space: nowrap;
      overflow: hidden; /* pour les navigateurs autres que IE (cache le texte qui dépasse) */
      text-overflow: ellipsis; /* ne marche que sous IE (tronque le texte en ajoutant '...') */
    }
     
    .sortable tr {
      overflow: hidden;
      white-space:nowrap;
     
    }
     
    thead tr td {
      white-space: normal;
    }
     
     
    #IdCommentaire{
      background-color:#FFFFE7; 
      border: 1px solid #DEDEDE; 
      color: black;
      position:absolute; 
      visibility:hidden;
      white-space:pre;/*nowrap;*/ /* indique de prendre le formatage tel quel avec retours à la ligne tabulations etc)*/
    }
     
     
    </style>
     
    <script type="text/javascript" src="js/framework/prototype.js"></script>
     
     
    <script type="text/javascript">
    //<![CDATA[
     
        function show_comment(event) {
          var elt_div = $('IdCommentaire');
          // on récupère ce qui est à l'origine du show comment
          var elt_td = Event.element(event)
          if (elt_div) {
            //elt_div.innerHTML='<pre>'+elt_td.innerHTML+'</pre>';
            elt_div.innerHTML=elt_td.innerHTML;
            //elt_div.innerHTML=elt_td.innerText.replace('\n','|');
            //cloneNode = elt_td.cloneNode(true);
            //elt_div.innerHTML="";
            //elt_div.appendChild(cloneNode);
            //elt_div.innerHTML=elt_td.firstChild.nodeValue.replace('\n','|');
            elt_div.style.visibility="visible";
          }     
        } 
        function hide_comment() {
          var elt_div = $('IdCommentaire')
          if (elt_div) {
            elt_div.style.visibility="hidden";
          }     
        }
     
      function initEvents() {
     
        if ($('detailBody')){
          Event.observe($('detailBody'), 'mouseover', show_comment.bindAsEventListener());
          Event.observe($('detailBody'), 'mouseout', hide_comment);
        }
     
      }
     
      Event.observe(window, 'load', initEvents, false);
      //]]>
     
    </script> 
     
    </head>
    <body>
     
     
      <div id="IdCommentaire"></div>
     
      <div id="inProgress" style="visibility: hidden;"><h4 style="color:#FEA620; margin:0px">Sort in progress, please wait...</h4></div>
     
      <table id="table1" border="1"  style="cellspacing: 0;cellpadding: 2;" >
        <thead >
        <tr >
          <td valign="top"  style=" width: 60px;">Exemple</td>
        </tr>
        </thead>
        <tbody id="detailBody">
        <tr >
           <td>&nbsp;test1
    Test 2 apres retour a la ligne
           </td>
        </tr >
        <tr >
           <td>dcvvko fbgfrb
             bnnthn
             thn 
             hyn hy
             hy
             ,hjy
              jy,jyu, jk,h
               ,hjy,jy
     
           </td>
        </tr >
        <tr >
           <td>un 
      deux
      trois
           </td>
        </tr>
      </tbody>
     
      </table>
        </body>
      </html>

  4. #4
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    étrange ... je viens de faire un test avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    test
    test
    test...
    sans les balises : pre , celle ci s'affiche bien en ligne,
    avec , les retours a la ligne sont bien pris en comptes.

    testé sous ie7 et firefox

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Heu, désolé je n'ai pas tout suivi

    Citation Envoyé par le_chomeur Voir le message
    sans les balises : pre , celle ci s'affiche bien en ligne,
    avec , les retours a la ligne sont bien pris en comptes.

    testé sous ie7 et firefox
    Le test correspond à la partie qui était commentée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elt_div.innerHTML='<pre>'+elt_td.innerHTML+'</pre>';
    que tu as décommentée ou a autre chose ?

    De plus, il y a de fortes chances que le comportement soit différent entre IE6 et IE 7

  6. #6
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    mes excuse effectivement les saut de ligne sautent , exemple simple :

    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
    <table>
    <tr><td style="border:1px solid black">
    <pre id="titi">
    test
    test
    test
    test
    test
    test
    test
    test
    test
    <pre>
    </td></tr>
    </table>
     
    <div id="toto">
    test
    </div>
     
    <div>
    <pre id="toto2">
    </pre>
    </div>
     
    <script type="text/javascript">
     
    (document.getElementById('toto').innerHTML  = "Sans Pre : "+document.getElementById('titi').innerHTML);
    (document.getElementById('toto2').innerHTML  = "Avec Pre : "+document.getElementById('titi').innerHTML);
     
     
    </script>
    je continu de chercher

  7. #7
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    voila j'ai trouvé : accroche toi :

    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
     
    <table>
    <tr><td style="border:1px solid black">
    <pre id="titi">
    test
    test
    test
    test
    test
    test
    test
    test
    test
    <pre>
    </td></tr>
    </table>
     
    <div id="toto">
    test
    </div>
     
    <div>
    <pre id="toto2">
    </pre>
    </div>
     
    <script type="text/javascript">
     
    (document.getElementById('toto').innerHTML  = "Sans Pre : "+document.getElementById('titi').innerHTML);
    (document.getElementById('toto2').appendChild(document.createTextNode("Avec Pre : "+document.getElementById('titi').firstChild.data)));
     
     
    </script>
    il faut non pas passer par le innerHTML , mais créer un noeud de type texte , en création dans ta div de destination , et au départ non pas récupèrer le innerHTML , mais récupèrer les data à l'état brut !
    sinon tu vas te retrouver avec quelque chose sous la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    test
    test
    test
    ...
    <pre></pre>
    voila voila

  8. #8
    Futur Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci pour ta recherche,
    mais j'ai l'impression que la différence entre innerHTML et appendChild n'est dûe qu'au fait qu'il manque un /PRE dans titi (si je met le /pre dans ton exemple, innerHTML marche comme le appendChild et fonctionnent correctement)

    Le problème c'est que j'aurais aimé quelque chose plutôt comme ceci
    (retours à la ligne ignorés dans la cellule du tableau et retour à la ligne pris en compte dans le div) :


    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
     
    <table>
    <tr><td style="border:1px solid black" id="titi">
    <!--pre  SANS la balise pre au niveau du tableau afin d'avoir tout sur une ligne-->
    test
    test
    test
    test
    test
    test
    test
    test
    test
    <!--/pre -->
    </td></tr>
    </table>
     
    <div id="toto">
    test
    </div>
     
    <div>
    <pre id="toto2">
    </pre>
    </div>
     
    <script type="text/javascript">
     
    (document.getElementById('toto').innerHTML  = "Sans Pre : "+document.getElementById('titi').innerHTML);
    (document.getElementById('toto2').appendChild(document.createTextNode("Avec Pre : "+document.getElementById('titi').firstChild.data)));
     
     
    </script>
    si je fais ça, (ou un alert(document.getElementById('titi').firstChild.data) ou un alert(document.getElementById('titi2').innerHTML) ), on voit que IE6 a bien 'l'air de supprimer de lui même les retours à la lignes dans la cellule. (alors que firefox les garde , pour IE7, je ne sais pas...)

  9. #9
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    Effectivement , si l'on sort le texte de la balise pre, ie "supprime" ces retours a la ligne ...
    j'ai essayé avec un "style='white-space: pre'" la balise td se comporte pourtant comme tel et prend bien en compte les retours chariot

    la je sèche ....

    je continue mes recherches

  10. #10
    Membre émérite
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Points : 2 814
    Points
    2 814
    Par défaut
    innerHTML bug sous ie ! Non corrigé sous ie7.
    passe par dom pour la copie...

  11. #11
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    c'est ce que j'ai essayé de faire , mais le problème c'est que ie fait sauter les \ quelque soit la méthode : innerHTML , createTextNode+firstChild.data également ...
    Peut-être avec un cloneNode ...

  12. #12
    Membre émérite
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Points : 2 814
    Points
    2 814
    Par défaut
    .test{
    white-space:pre;
    }

    <div class="test" id="titi"></div>


    <div id="toto">

    &nbsp;test1
    Test 2 apres
    retour a la ligne
    </div>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function copyNode(fromNode, toNode) {
    //suppression
      for ( n=toNode.childNodes.length-1; n>=0; n--) {
      var oldChild = toNode.childNodes[n];
      toNode.removeChild(oldChild);
      }
      //copie
     for ( n=0; n<fromNode.childNodes.length; n++) {
       var fromChild = fromNode.childNodes[n].cloneNode(true);   
       var toChild = toNode.appendChild(fromChild);   
     }
    }
     
    copyNode(document.getElementById("toto"),document.getElementById("titi"));
    marche

  13. #13
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    Effectivement , j'étais pas loin
    Merci mathieu

  14. #14
    Membre émérite
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Points : 2 814
    Points
    2 814
    Par défaut
    par contre vous avez un autre problème : les cellules des tables sont regénérées !

  15. #15
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    effectivement , et la ou ça devient problématique , j'ai essayé de tapé directement sur le contenu de la célulle pour en faire un nœud a copier :

    document.getElementById('titi').childNodes[0] <== corespond au texte

    et la rebelote les \n sautent

  16. #16
    Membre émérite
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Points : 2 814
    Points
    2 814
    Par défaut
    ajoute un tag! span div ... et vous aurez un pb avec le script prototype.

    Et si vous changer tout simplement le className de la cellule c'est simple efficace et marche à coup sur

  17. #17
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    hein ??? pas compris ton dernier post

  18. #18
    Membre émérite
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Points : 2 814
    Points
    2 814
    Par défaut
    <td>ici<span>&nbsp;test1
    Test 2 apres retour a la ligne</span>
    </td>
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <td 
    onmouseover="this.className='classAvecPre';"
    onmouseout="this.className='classSansPre';"
    >&nbsp;test1
    Test 2 apres retour a la ligne
           </td>
    a tester

  19. #19
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    oui effectivement
    mais ça ne répond pas , a la question : comment copier un noeud en gardant les \n ( quand je parle de noeud je veux parler du contenu ) sous ie ^^

  20. #20
    Membre émérite
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Points : 2 814
    Points
    2 814
    Par défaut
    la fonction copyNode le fais!

    votre soucis c'est que le contenu ne contient plus les \n (dépend des class appliquée)

    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
    <div  class="test" id="titi" onclick="alert(this.innerHTML)">  
    	  <span> 
    	   &nbsp;test1
    	   Test 2 apres 
    	   retour a la ligne
    	   </span>
      </div>
     
     
      <div id="toto" onclick="alert(this.innerHTML)">
    	   <span> 
    	   &nbsp;test1
    	   Test 2 apres 
    	   retour a la ligne
    	   </span>
    </div>

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/09/2007, 12h32

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