Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1129 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  comment faire ? insertion dynamique de lignes dans un tableau

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

comment faire ? insertion dynamique de lignes dans un tableau

n°588188
Kermit_The​_Frog
Posté le 11-12-2003 à 11:02:12  profilanswer
 

Dans le cadre d'un stage, je dois réaliser un écran qui permet d'ajouter des lignes ou d'en supprimer dans un tableau affiché dans la page.
Et ce, bien évidemment en n'effaçant pas les lignes déjà encodées.
L'insertion dans la base de données MySql ne devant se faire qu'après validation de l'ensemble.
Quelqu'un a-t-il une idée ou un lien avec un tuto ? Paske là, je queutte depuis quasi une semaine pour trouver une solution. :pfff:  
Merciiiiiiii

mood
Publicité
Posté le 11-12-2003 à 11:02:12  profilanswer
 

n°588207
Mr yvele
yvele n'est plus.
Posté le 11-12-2003 à 11:14:00  profilanswer
 

fait une classe  [:sinclaire]


---------------
yvele n'est plus.
n°588210
Kermit_The​_Frog
Posté le 11-12-2003 à 11:18:35  profilanswer
 

J'y avais pensé mais je me demandais s'il n'y avait pas une autre solution.
je vais tenter cette voie.
Si tu connais un site avec un exemple, je suis preneur.

n°588216
Mr yvele
yvele n'est plus.
Posté le 11-12-2003 à 11:25:02  profilanswer
 

ben commence déjà à bosser dessus..
et montre nous.. si t'as un probleme, je serais ravi de t'aider..
 
mais par contre ici on est pas du style à te faire les exos à ta place [:ripeer]


---------------
yvele n'est plus.
n°588254
Hermes le ​Messager
Breton Quiétiste
Posté le 11-12-2003 à 12:04:26  profilanswer
 

Kermit_the_Frog a écrit :

Dans le cadre d'un stage, je dois réaliser un écran qui permet d'ajouter des lignes ou d'en supprimer dans un tableau affiché dans la page.
Et ce, bien évidemment en n'effaçant pas les lignes déjà encodées.
L'insertion dans la base de données MySql ne devant se faire qu'après validation de l'ensemble.
Quelqu'un a-t-il une idée ou un lien avec un tuto ? Paske là, je queutte depuis quasi une semaine pour trouver une solution. :pfff:  
Merciiiiiiii  


 
Ben c'est pas dur.
 
Tu fait donc une page de formulaire qui contient ton tableau. En bas de ce tableau donc le formulaire qui pointe vers une page de traitement. Cette page de traitement va donc "traiter" les données du formulaire, fait ce qu'il faut dans la BDD puis renvoie à nouveau vers la page qui contient ton tableau et le formulaire.

n°588273
Mara's dad
Yes I can !
Posté le 11-12-2003 à 12:37:53  profilanswer
 

Javascript :D
 
 
Démo :

Code :
  1. <html>
  2. <head>
  3. <script>
  4. var nb=3;
  5. function suppr( x )
  6. {
  7. var tb = '';
  8. for( i=1; i<=nb; i++ )
  9. {
  10.  if( x != i )
  11.  {
  12.   if( i < x )
  13.   {
  14.    j = i;
  15.   }
  16.   else
  17.   {
  18.    j = i - 1;
  19.   }
  20.   tb = tb + '<tr id="tr' + j + '"><td><input type="text" name="l' + j + '" id="l' + j + '"value="' + document.getElementById('l'+i).value + '"></td><td><button type="button" onclick="suppr(' + j + ')">Del</button></td></tr>';
  21.  }
  22. }
  23. if( document.all )
  24. {
  25.  document.getElementById('tb').outerHTML = '<table id="tb">' + tb + '</table>';
  26. }
  27. else
  28. {
  29.  document.getElementById('tb').innerHTML = tb;
  30. }
  31. nb--;
  32. }
  33. </script>
  34. </head>
  35. <body>
  36. <form>
  37. <table id="tb">
  38. <tr id="tr1"><td><input type="text" name="l1" id="l1" value="Ligne 1"></td><td><button type="button" onclick="suppr(1)">Del</button></td></tr>
  39. <tr id="tr2"><td><input type="text" name="l2" id="l2" value="Ligne 2"></td><td><button type="button" onclick="suppr(2)">Del</button></td></tr>
  40. <tr id="tr3"><td><input type="text" name="l3" id="l3" value="Ligne 3"></td><td><button type="button" onclick="suppr(3)">Del</button></td></tr>
  41. </table>
  42. <input type="submit">
  43. </form>
  44. </body>
  45. </html>


 
Bon, y'a que la suppression, je te laisse faire l'insertion !
 
Avec IE, outerHTML, pour NS/MOZ : innerHTML (donc sans <table...> et </table> )
 
Edit : Correction, oubli des id pour les <input...> :D


Message édité par Mara's dad le 11-12-2003 à 12:51:18

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°588282
Kermit_The​_Frog
Posté le 11-12-2003 à 13:14:41  profilanswer
 

merci beaucoup, je vais essayer tout ça (j'ai du pain sur la planche moi !)

n°588286
Mara's dad
Yes I can !
Posté le 11-12-2003 à 13:20:27  profilanswer
 

Tiens, j'ai fait l'ajout aussi pour rigoler !
 

Code :
  1. <html>
  2. <head>
  3. <script>
  4. var nb=0;
  5. function suppr( x )
  6. {
  7. var tb = '';
  8. for( i=1; i<=nb; i++ )
  9. {
  10.  if( x != i )
  11.  {
  12.   if( i < x )
  13.   {
  14.    j = i;
  15.   }
  16.   else
  17.   {
  18.    j = i - 1;
  19.   }
  20.   tb = tb + genLigne( j , document.getElementById('l'+i).value );
  21.  }
  22. }
  23. if( document.all )
  24. {
  25.  document.getElementById('tb').outerHTML = '<table id="tb">' + tb + '</table>';
  26. }
  27. else
  28. {
  29.  document.getElementById('tb').innerHTML = tb;
  30. }
  31. nb--;
  32. }
  33. function ins( x )
  34. {
  35. var tb = '';
  36. for( i=1; i<=nb; i++ )
  37. {
  38.  if( x == i )
  39.  {
  40.   tb = tb + genLigne( i , 'Nouvelle ligne N°' + i );
  41.  }
  42.  if( i < x )
  43.  {
  44.   j = i;
  45.  }
  46.  else
  47.  {
  48.   j = i + 1;
  49.  }
  50.  tb = tb + genLigne( j , document.getElementById('l'+i).value );
  51. }
  52. if( document.all )
  53. {
  54.  document.getElementById('tb').outerHTML = '<table id="tb">' + tb + '</table>';
  55. }
  56. else
  57. {
  58.  document.getElementById('tb').innerHTML = tb;
  59. }
  60. nb++;
  61. }
  62. function add()
  63. {
  64. var tb = '';
  65. nb++;
  66. tb = document.getElementById('tb').innerHTML + genLigne( nb , 'Nouvelle ligne N°' + nb );
  67. if( document.all )
  68. {
  69.  document.getElementById('tb').outerHTML = '<table id="tb">' + tb + '</table>';
  70. }
  71. else
  72. {
  73.  document.getElementById('tb').innerHTML = tb;
  74. }
  75. }
  76. function genLigne( num , value )
  77. {
  78. return( '<tr id="tr' + num + '"><td><input type="text" name="l' + num + '" id="l' + num + '" value="' + value + '"></td><td><button type="button" onclick="suppr(' + num + ');">Del</button><button type="button" onclick="ins(' + num + ');">Ins</button></td></tr>' );
  79. }
  80. </script>
  81. </head>
  82. <body>
  83. <form>
  84. <table id="tb">
  85. </table>
  86. <button type="button" onclick="add();">Add</button><input type="submit">
  87. </form>
  88. </body>
  89. </html>


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°588287
Kermit_The​_Frog
Posté le 11-12-2003 à 13:22:55  profilanswer
 

tu ne veux pas me faire un ajout de tes capacités dans mon cerveau par hasard ? ;-)
encore merci, un tout GRAND ! :-)

n°588288
Mara's dad
Yes I can !
Posté le 11-12-2003 à 13:26:39  profilanswer
 

Bof, je l'ai pondu de mémoire.
J'ai déjà fais un truc dans le genre pour un projet.
A l'époque, j'avais mis un certain temps à le faire...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
mood
Publicité
Posté le 11-12-2003 à 13:26:39  profilanswer
 

n°589104
Kermit_The​_Frog
Posté le 12-12-2003 à 14:01:15  profilanswer
 

j'ai tenté de modifier mais ça fonctionne plus !
aaaahhh, j'suis trop paumé sur ce coup-là.
je nage en javascript et du coup, je ne saisis pas certaines subtilités de méthodes.
mon code :  

Code :
  1. <!-- this script is used to add/remove lines in the table -->
  2. <script language="javascript" >
  3. <!--
  4.   var nb=0;
  5.   const HEADERTABLE = '<TR><TD><B>from (dd-mm-yyyy)</B></TD>'
  6.       + '<TD><B>to (dd-mm-yyyy)</B></TD>'
  7.       + '<TD><B>qualification</B></TD>'
  8.       + '<TD><B>course attended</B></TD>'
  9.       + '<TD><B>diploma obtained</B></TD>'
  10.       + '<TD><B>distinction</B></TD>'
  11.       + '<TD><B>dissertation</B></TD>'
  12.       + '<TD><B></B></TD>'
  13.       + '<TD><B></B></TD>'
  14.       + '</TR>';
  15.   function suppr( x )
  16.   {
  17.      var tb = '';
  18.      for( i=1; i<=nb; i++ )
  19.      {
  20.         if( x != i )
  21.         {
  22.            if( i < x )
  23.            {
  24.               j = i;
  25.            }
  26.            else
  27.            {
  28.               j = i - 1;
  29.            }
  30.            tb = tb + genLigne( j , document.getElementById('l'+i).value );
  31.         }
  32.      }
  33.      if( document.all )
  34.      {
  35.         document.getElementById('tb').outerHTML = '<table id="tb">' + HEADERTABLE + tb + '</table>';
  36.      }
  37.      else
  38.      {
  39.         document.getElementById('tb').innerHTML = tb;
  40.      }
  41.      nb--;
  42.   }
  43.   function ins( x )
  44.   {
  45.      var tb = '';
  46.      for( i=1; i<=nb; i++ )
  47.      {
  48.         if( x == i )
  49.         {
  50.            tb = tb + genLigne( i , 'Nouvelle ligne N°' + i );
  51.         }
  52.         if( i < x )
  53.         {
  54.            j = i;
  55.         }
  56.         else
  57.         {
  58.            j = i + 1;
  59.         }
  60.         tb = tb + genLigne( j , document.getElementById('l'+i).value );
  61.      }
  62.      if( document.all )
  63.      {
  64.         document.getElementById('tb').outerHTML = '<table id="tb">' + HEADERTABLE + tb + '</table>';
  65.      }
  66.      else
  67.      {
  68.         document.getElementById('tb').innerHTML = tb;
  69.      }
  70.      nb++;
  71.   }
  72.   function add()
  73.   {
  74.      var tb = '';
  75.      nb++;
  76.      tb = document.getElementById('tb').innerHTML + genLigne( nb , 'Nouvelle ligne N°' + nb );
  77.      if( document.all )
  78.      {
  79.         document.getElementById('tb').outerHTML = '<table id="tb">' + HEADTABLE + tb + '</table>';
  80.      }
  81.      else
  82.      {
  83.         document.getElementById('tb').innerHTML = tb;
  84.      }
  85.   }
  86.   function genLigne( num , value )
  87.   {
  88.  return('<tr id="tr' + num + '">'
  89.         + '<TD><INPUT TYPE="TEXT" NAME="from_date-' + num + '" VALUE="" SIZE="10" MAXLENGTH="10">'
  90.         + '<font color="#FF0000" size="3"><B> * </B></font></TD>'
  91.         + '<TD><INPUT TYPE="TEXT" NAME="to_date-' + num + '" VALUE="" SIZE="10" MAXLENGTH="10">'
  92.         + '<font color="#FF0000" size="3"><B> * </B></font></TD>'
  93.         + '<TD><SELECT NAME="qualification_id-' + num + '" SIZE='1'>'
  94.         + '<OPTION VALUE="0" SELECTED>Java Engineer - Sun - Bruxelles - Belgium</OPTION>'
  95.         + '</SELECT><font color="#FF0000" size="3"><B> * </B></font>'
  96.         + '<INPUT TYPE="submit" NAME="qualifications" VALUE="New-' + num + '"></TD>'
  97.         + '<TD><INPUT TYPE="CHECKBOX" NAME="course_attended-' + num + '" VALUE="course_attended-' + num + '">'
  98.         + '<font color="#FF0000" size="3"><B> * </B></font></TD>'
  99.         + '<TD><INPUT TYPE="CHECKBOX" NAME="diploma_obtained-' + num + '" VALUE="diploma_obtained-' + num + '">'
  100.         + '<font color="#FF0000" size="3"><B> * </B></font></TD>'
  101.         + '<TD><INPUT TYPE="CHECKBOX" NAME="distinction-' + num + '" VALUE="distinction-' + num + '"></TD>'
  102.         + '<TD><INPUT TYPE="TEXT" NAME="dissertation-' + num + '" VALUE="" SIZE='30' MAXLENGTH='100'></TD>'
  103.         + '<TD><button type="button" onclick="ins(' + num + ');">Ins</button></TD>'
  104.   + '<TD><button type="button" onclick="suppr(' + num + ');">Del</button></TD>'
  105.      );
  106.   }
  107.   -->
  108. </script>
  109. </head>
  110. <body>
  111. <?php
  112. //-------------------------------------------------------------------------------------
  113.     function formCreateModify($database, $mode, $employee_id){
  114.      if ($mode == "create" ){
  115.   echo "<form method=\"POST\" "
  116.     ." action=\"qualif_prof_trainings.php?mode=insert&employee_id=$employee_id\">\n";
  117.   //--- qualification's part of the form
  118.   echo "<br>\n<div align=\"center\">Qualifications</div>\n<br>\n";
  119.   echo "<table id=\"tb\">\n";
  120.   echo "<TR><TD><B>from (dd-mm-yyyy)</B></TD>\n"
  121.     ."<TD><B>to (dd-mm-yyyy)</B></TD>\n"
  122.     ."<TD><B>qualification</B></TD>\n"
  123.     ."<TD><B>course attended</B></TD>\n"
  124.     ."<TD><B>diploma obtained</B></TD>\n"
  125.     ."<TD><B>distinction</B></TD>\n"
  126.     ."<TD><B>dissertation</B></TD>\n"
  127.     ."<TD><B></B></TD>\n"
  128.     ."<TD><B></B></TD>\n"
  129.     ."</TR>\n";
  130.   echo "</table>\n";
  131.   echo "<button type=\"button\" onclick=\"add();\">Add</button>\n";
  132.       //--- professionnal trainings' part of the form
  133.   echo "<br>\n<div align=\"center\">Professional trainings</div>\n<br>\n";
  134.   echo "<div align=\"center\"><input type=\"submit\" name=\"create\" value=\"create\">"
  135.      ."</div>\n";
  136.   echo "</form>\n";
  137.      }
  138.     } //end function formCreateModify)

n°589123
Mara's dad
Yes I can !
Posté le 12-12-2003 à 14:36:16  profilanswer
 

Ben c'est pourtant pas compliqué...
 
Déjà, tu le sort d'où le mot clef 'const' ?
Cà n'existe pas ce truc. Met var et çà va déjà mieux.
 
Ensuite, dans genLigne(), tu as des SIZE='1' au lieu de SIZE="1".
Ben oui, le ' çà ferme ta chaine, alors fait gaffe.
 
Ensuite, dans add() tu utilises  
HEADTABLE au lieu de
HEADERTABLE
Et çà, ben çà passe pas.
 
Ensuite, toujours dans add(). Il s'agit d'ajouter une ligne vide à la fin du tableau. genLigne() te retourne une ligne que tu ajoute à on tableau. Mais comme il faut regénérer le tableau entier tu fait çà :
tb = document.getElementById('tb').innerHTML + genLigne( nb , 'Nouvelle ligne N°' + nb );
Bon, tb contient l'ancien contenu du tableau plus une nouvelle ligne.
Ensuite, tu fait çà :
document.getElementById('tb').outerHTML = '<table id="tb">' + HEADTABLE + tb + '</table>';
Donc ton tableau conteint maintenant :
DEUX header + les lignes...
 
Au fait un header en html c'est pas  
<td><b>Blabla</b></td>  mais  
<th>Blabla<th>
 
Enfin, pour ins() et del() on verra plus tard quand le début marchera, mais si tu ne met pas un id sur chaque input, tu ne pourra pas les lire pour regénérer le tableu avec ce que l'utilisateur à saisi.
Il faudra aussi modifier genligne() pour passer toutes les valeurs. Soit par autant de paramètres que de <input>, soit par un tableau...


Message édité par Mara's dad le 12-12-2003 à 14:41:47

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°589130
Kermit_The​_Frog
Posté le 12-12-2003 à 14:43:43  profilanswer
 

ok, pour le const, j'étais persuadé que ça fonctionnait et puis non, non j'avais trouvé qu'il fallait l'enlever.  
Pour les ' j'avais foiré un copier/coller venant de mon code PHP et pas fais gaffe, scrogneugneu :)  
J'ai donc corrigé tout cela et ... ça va mieux :-)
mais j'ai encore une question "idiote" (on change pas une équipe qui gagne, merci de ta patience) :
je voudrais avoir une première ligne du tableau dès le chargement de la page.
Puis-je faire un appel de add() directement dans mon code php ?

n°589133
Mara's dad
Yes I can !
Posté le 12-12-2003 à 14:47:31  profilanswer
 

Ben tu peux par exemple le faire dans body !
<body onload="add();">


Message édité par Mara's dad le 12-12-2003 à 14:47:47

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°589136
Kermit_The​_Frog
Posté le 12-12-2003 à 14:48:31  profilanswer
 

merci le barbu, merci le barbu, merci !!!
j'ai déjà fait une partie des modifs, je continue ...

n°589137
Mara's dad
Yes I can !
Posté le 12-12-2003 à 14:49:10  profilanswer
 

Et puis ce qui serait bien c'est :  
un <html>
un <head>
un </body>
un </html>
Mais bon, s'est juste pour faire chier hein :D


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°589138
Mara's dad
Yes I can !
Posté le 12-12-2003 à 14:50:24  profilanswer
 

Pense à nous montrer ce que çà donne une fois fini STP ;)


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°589141
Kermit_The​_Frog
Posté le 12-12-2003 à 14:54:07  profilanswer
 

pas de prob pour la diffusion une fois fini !
en ce qui concerne les balises html, tout est incorporé dans un include header php :)

n°589142
Mara's dad
Yes I can !
Posté le 12-12-2003 à 14:56:46  profilanswer
 

Ok, c'est pour çà qu'on vois qu'un bout de code.
 
Le plus simple alors, c'est de montrer le HTML généré par PHP.
Parce-que pour débugger du javascript, il vaut mieux avoir EXACTEMENT la même chose que le navigateur ;)


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°589328
Kermit_The​_Frog
Posté le 12-12-2003 à 17:23:41  profilanswer
 

ça avance tout doucement
derniers points améliorés :  

  • gestion des valeurs déjà remplies grâce à un tableau
  • protection pour empêcher le user de supprimer l'unique ligne d'un tableau  

cool, je continue lundi paske là, c'est week-end !  :sol:  

n°591327
Mara's dad
Yes I can !
Posté le 15-12-2003 à 19:00:03  profilanswer
 

Nouvelle version en utilisant DOM au lieu de bricoller le HTML :D
 

Code :
  1. <html>
  2. <head>
  3. <script>
  4. function suppr( myNode )
  5. {
  6. // Spécial IE qui ne fait pas les choses suivant la norme :/
  7. if( document.all )
  8. {
  9.  myNode = window.event.srcElement;
  10. }
  11. // myNode.parentNode.parentNode est le parent <tr> du parent <td> du bouton <button>+</button>
  12. // myNode.parentNode.parentNode.parentNode est le parent <tbody> du parent <tr> du parent <td> du bouton <button>+</button>
  13. // Donc on supprime <tr> du bouton sur lequel on click du <tbody>.
  14. myNode.parentNode.parentNode.parentNode.removeChild( myNode.parentNode.parentNode );
  15. }
  16. function ins( myNode )
  17. {
  18. // Spécial IE qui ne fait pas les choses suivant la norme :/
  19. if( document.all )
  20. {
  21.  myNode = window.event.srcElement;
  22. }
  23. // myNode.parentNode.parentNode est le parent <tr> du parent <td> du bouton <button>+</button>
  24. // myNode.parentNode.parentNode.parentNode est le parent <tbody> du parent <tr> du parent <td> du bouton <button>+</button>
  25. // Donc on ajoute un nouveau <tr> dans le <tbody> avant le <tr> du bouton sur lequel on click.
  26. myNode.parentNode.parentNode.parentNode.insertBefore( newLine(), myNode.parentNode.parentNode );
  27. }
  28. // Ajout d'une ligne en fin de tableau
  29. function add()
  30. {
  31. // tb est le <tbody> de notre table
  32. // On lui ajoute un nouveau <tr>
  33. document.getElementById('tb').appendChild( newLine() );
  34. }
  35. // Génération d'une ligne vide pour le tableau
  36. // Il nous faut :
  37. // 1 tr
  38. // 2 td
  39. // 1 input
  40. // 2 boutons
  41. function newLine()
  42. {
  43. // Un nouveau <tr>
  44. var newTR = document.createElement( 'tr' );
  45. // Un nouveau <td>
  46. var newTD1 = newTR.appendChild( document.createElement( 'td' ) );
  47. // Un nouvel <input>  
  48. var newInput = newTD1.appendChild( document.createElement( 'input' ) );
  49. newInput.setAttribute( 'type', 'text' );
  50. newInput.setAttribute( 'name', 'data[]' );
  51. newInput.setAttribute( 'value', 'Nouvelle cellule' );
  52. // Un autre <td>
  53. var newTD2 = newTR.appendChild( document.createElement( 'td' ) );
  54. // Un bouton <button>
  55. var btDel = newTD2.appendChild( document.createElement( 'button' ) );
  56. btDel.setAttribute( 'type', 'button' );
  57. btDel.setAttribute( 'onclick', 'suppr(this);' );
  58. // Spécial IE qui ne fait pas les choses suivant la norme :/
  59. if( document.all )
  60. {
  61.  btDel.attachEvent( 'onclick', suppr );
  62. }
  63. btDel.appendChild( document.createTextNode( '-' ) );
  64. // Un autre bouton <button>
  65. var btIns = newTD2.appendChild( document.createElement( 'button' ) );
  66. btIns.setAttribute( 'type', "button" );
  67. btIns.setAttribute( 'onclick', 'ins(this);' );
  68. // Spécial IE qui ne fait pas les choses suivant la norme :/
  69. if( document.all )
  70. {
  71.  btIns.attachEvent( 'onclick', ins );
  72. }
  73. btIns.appendChild( document.createTextNode( '+' ) );
  74. // On renvoie le <tr> avec tout ce qu'il contient.
  75. return newTR;
  76. }
  77. function init()
  78. {
  79. // Si le tableau est vide, on ajoute une ligne.
  80. // Attention, avec MOZILLA, il ne faut même par un retour à la ligne entre <tbody> et </tbody> sinon il considère qu'il y a un child.
  81. // IE est moins strict.
  82. if( ! document.getElementById( 'tb' ).hasChildNodes() )
  83. {
  84.  add();
  85. }
  86. }
  87. </script>
  88. </head>
  89. <body onload="init();">
  90. <form>
  91. <table>
  92. <tbody id="tb"></tbody>
  93. </table>
  94. <button type="button" onclick="add();">+</button>
  95. <input type="submit">
  96. </form>
  97. </body>
  98. </html>


 
C'est compatible IE et MOZ.
IE pose juste un problème avec la définition des attributs qui sont des événements. Obligé de passer par un truc à la con spécial IE. Voir commentaires :/
 
Une solution envisageable pour remplacer la construction d'une ligne entièrement à la main en javascript :
Ajouter un tableau pas affiché (style="display:none;" ) avec une ligne de référence qu'il suffira de cloner.
 
Ce qui donne :

Code :
  1. <html>
  2. <head>
  3. <script>
  4. function suppr( myNode )
  5. {
  6. // myNode.parentNode.parentNode est le parent <tr> du parent <td> du bouton <button>+</button>
  7. // myNode.parentNode.parentNode.parentNode est le parent <tbody> du parent <tr> du parent <td> du bouton <button>+</button>
  8. // Donc on supprime <tr> du bouton sur lequel on click du <tbody>.
  9. myNode.parentNode.parentNode.parentNode.removeChild( myNode.parentNode.parentNode );
  10. }
  11. function ins( myNode )
  12. {
  13. // myNode.parentNode.parentNode est le parent <tr> du parent <td> du bouton <button>+</button>
  14. // myNode.parentNode.parentNode.parentNode est le parent <tbody> du parent <tr> du parent <td> du bouton <button>+</button>
  15. // Donc on ajoute un nouveau <tr> dans le <tbody> avant le <tr> du bouton sur lequel on click.
  16. myNode.parentNode.parentNode.parentNode.insertBefore( document.getElementById( 'newLine' ).cloneNode( true ), myNode.parentNode.parentNode );
  17. }
  18. // Ajout d'une ligne en fin de tableau
  19. function add()
  20. {
  21. // tb est le <tbody> de notre table
  22. // On lui ajoute un nouveau <tr>
  23. document.getElementById('tb').appendChild( document.getElementById( 'newLine' ).cloneNode( true ) );
  24. }
  25. function init()
  26. {
  27. // Si le tableau est vide, on ajoute une ligne.
  28. // Attention, avec MOZILLA, il ne faut même par un retour à la ligne entre <tbody> et </tbody> sinon il considère qu'il y a un child.
  29. // IE est moins strict.
  30. if( ! document.getElementById( 'tb' ).hasChildNodes() )
  31. {
  32.  add();
  33. }
  34. }
  35. </script>
  36. </head>
  37. <body onload="init();">
  38. <form>
  39. <table>
  40. <thead>
  41.  <tr>
  42.   <th>Nom</th>
  43.   <th>Prénom</th>
  44.   <th>Adresse</th>
  45.   <th>Actions</td>
  46.  </tr>
  47. </thead>
  48. <tbody id="tb"></tbody>
  49. </table>
  50. <button type="button" onclick="add();">+</button>
  51. <input type="submit">
  52. </form>
  53. <table style="display:none;">
  54. <tbody>
  55.  <tr id="newLine">
  56.   <td>
  57.    <input type="text" name="Nom[]" value="...">
  58.   </td>
  59.   <td>
  60.    <input type="text" name="Prenom[]" value="...">
  61.   </td>
  62.   <td>
  63.    <input type="text" name="Adresse[]" value="...">
  64.   </td>
  65.   <td>
  66.    <button type="button" onClick="suppr(this)">-</button>
  67.    <button type="button" onClick="ins(this)">+</button>
  68.   </td>
  69.  </tr>
  70. </tbody>
  71. </table>
  72. </body>
  73. </html>


 
C'est quand même plus pratique comme çà, et en plus y'a plus le problème avec IE et le événements :D


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°591637
Kermit_The​_Frog
Posté le 16-12-2003 à 11:18:52  profilanswer
 

c'est effectivement plus pratique au niveau du codage :)
Par contre, je viens de terminer d'adapter la première version à mes besoins.  
voici le code HTML généré par PHP

Code :
  1. <html>
  2. <head>
  3. <title>-- Qualifications - professional trainings -- Solid Partners' Knowledge Management System</title>
  4. <link rel="stylesheet" href="kms.css" type="text/css">
  5. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  6. <!-- these scripts are used to add/remove lines in the tables -->
  7. <script language="Javascript" src="scripts/add_remove_line_qualifications.js">
  8. </script>
  9. <script language="Javascript" src="scripts/add_remove_line_prof_trainings.js">
  10. </script>
  11. </head>
  12. <body>
  13. <form name="qualTrainForm" method="GET"   
  14. action="qualif_prof_trainings.php?mode=insert&employee_id=789798">
  15. <br>
  16. <!-- premier tableau -->
  17. <div align="center">Qualifications</div>
  18. <br>
  19. <table id="tbQual" border="1">
  20. <TR>
  21. <TH><div align="center">from (dd-mm-yyyy)</div></TH>
  22. <TH><div align="center">to (dd-mm-yyyy)</div></TH>
  23. <TH><div align="center">qualification</div></TH>
  24. <TH><div align="center">course attended</div></TH>
  25. <TH><div align="center">diploma obtained</div></TH>
  26. <TH><div align="center">distinction</div></TH>
  27. <TH><div align="center">dissertation</div></TH>
  28. <TH></TH>
  29. <TH></TH>
  30. </TR>
  31. </table>
  32. <br>
  33. <!-- deuxième tableau -->
  34. <div align="center">Professional trainings</div>
  35. <br>
  36. <table id="tbTrain" border="1">
  37. <TR>
  38. <TH><div align="center">date (dd-mm-yyyy)</div></TH>
  39. <TH><div align="center">institution</div></TH>
  40. <TH><div align="center">subject</div></TH>
  41. <TH><div align="center">module</div></TH>
  42. <TH><div align="center">technology sector</div></TH>
  43. <TH><div align="center">business sector</div></TH>
  44. <TH><div align="center">certification</div></TH>
  45. <TH></TH>
  46. <TH></TH>
  47. </TR>
  48. </table>
  49. <!-- chargement des deux tableaux -->
  50. <body onload="addQual();addTrain();">
  51. <br>
  52. <div align="center">
  53. <input type="submit" name="create" value="create">
  54. </div>
  55. </form>
  56. <BR>
  57. </body>
  58. </html>


et les deux fonctions javascript fort proches l'une de l'autre, mais bon soyons complet  :ange:  
add_remove_line_qualifications.js

Code :
  1. <!--
  2.   var nbQual=0;
  3.   var numLinesQual = 0; //number of lines in the table
  4.   //header for the table
  5.   HEADERTABLEQUAL = '<TR><TH><div align="center">from (dd-mm-yyyy)</div></TH>'
  6.       + '<TH><div align="center">to (dd-mm-yyyy)</div></TH>'
  7.       + '<TH><div align="center">qualification</div></TH>'
  8.       + '<TH><div align="center">course attended</div></TH>'
  9.       + '<TH><div align="center">diploma obtained</div></TH>'
  10.       + '<TH><div align="center">distinction</div></TH>'
  11.       + '<TH><div align="center">dissertation</div></TH>'
  12.       + '<TH></TH>'
  13.       + '<TH></TH>'
  14.       + '</TR>';
  15.   //default values used to initialize the fields
  16.   DEFVALUESQUAL = new Array ("00-00-0000","00-00-0000",false,false,false,false,"" );
  17.   //function to delete the specified line
  18.   function delLineQual( x )
  19.   {
  20.      var tb = '';
  21.      numLinesQual--;
  22.      for( i=1; i<=nbQual; i++ )
  23.      {
  24.         if( x != i ){
  25.            if( i < x ){
  26.               j = i;
  27.            }
  28.            else{
  29.               j = i - 1;
  30.            }
  31.            //to get back the values of the fields
  32.            var savedValues = new Array(
  33.          document.getElementById('from_date'+i).value,
  34.                    document.getElementById('to_date'+i).value,
  35.                    document.getElementById('qualification_id'+i).value,
  36.                    document.getElementById('course_attended'+i).value,
  37.                    document.getElementById('diploma_obtained'+i).value,
  38.                    document.getElementById('distinction'+i).value,
  39.                    document.getElementById('dissertation'+i).value);
  40.            tb = tb + genLigneQual( j , savedValues );
  41.         }
  42.      }
  43.      if( document.all ){
  44.         document.getElementById('tbQual').outerHTML =
  45.            '<table id="tbQual" border="1">'
  46.            + HEADERTABLEQUAL + tb
  47.            + '</table>';
  48.      }
  49.      else{
  50.         document.getElementById('tbQual').innerHTML = HEADERTABLEQUAL + tb;
  51.      }
  52.      nbQual--;
  53.   }
  54.   //function to insert a line
  55.   function insertLineQual( x )
  56.   {
  57.      var tb = '';
  58.  numLinesQual++;
  59.      for( i=1; i<=nbQual; i++ ){
  60.     if( x == i ){
  61.            tb = tb + genLigneQual( i , DEFVALUESQUAL );
  62.         }
  63.         if( i < x ){
  64.            j = i;
  65.         }
  66.         else{
  67.            j = i + 1;
  68.         }
  69.         //to get back the values of the fields
  70.         var savedValues = new Array(
  71.       document.getElementById('from_date'+i).value,
  72.                 document.getElementById('to_date'+i).value,
  73.                 document.getElementById('qualification_id'+i).value,
  74.                 document.getElementById('course_attended'+i).checked,
  75.                 document.getElementById('diploma_obtained'+i).checked,
  76.                 document.getElementById('distinction'+i).checked,
  77.                 document.getElementById('dissertation'+i).value);
  78.         tb = tb + genLigneQual( j , savedValues );
  79.      }
  80.      if( document.all ){
  81.         document.getElementById('tbQual').outerHTML =
  82.            '<table id="tbQual" border="1">'
  83.            + HEADERTABLEQUAL + tb
  84.            + '</table>';
  85.      }
  86.      else{
  87.         document.getElementById('tbQual').innerHTML = HEADERTABLEQUAL + tb;
  88.      }
  89.      nbQual++;
  90.   }
  91.   //function to initialize the table
  92.   function addQual()
  93.   {
  94.      var tb = '';
  95.      nbQual++;
  96.      numLinesQual++;
  97.      tb = document.getElementById('tbQual').innerHTML
  98.     + genLigneQual( nbQual , DEFVALUESQUAL );
  99.      if( document.all ){
  100.         document.getElementById('tbQual').outerHTML =
  101.            '<table id="tbQual" border="1">'
  102.            + tb + '</table>';
  103.      }
  104.      else{
  105.         document.getElementById('tbQual').innerHTML = tb;
  106.      }
  107.   }
  108.   function genLigneQual( num , fieldValues )
  109.   {
  110.  var strReturn = '<tr id="tr' + num + '">'
  111.             + '<TD><INPUT TYPE="TEXT" NAME="from_date-' + num
  112.       +  '" ID="from_date' + num + '" VALUE="' + fieldValues[0]
  113.       +  '" SIZE="10" MAXLENGTH="10">'
  114.             +  '<font color="#FF0000" size="3"><B> * </B></font></TD>'
  115.             + '<TD><INPUT TYPE="TEXT" NAME="to_date-' + num
  116.       +  '" ID="to_date' + num + '" VALUE="' + fieldValues[1]
  117.       +  '" SIZE="10" MAXLENGTH="10">'
  118.       +  '<font color="#FF0000" size="3"><B> * </B></font></TD>'
  119.             + '<TD><SELECT NAME="qualification_id-' + num
  120.       +  '" SIZE="1" ID="qualification_id' + num + '">'
  121.             +  '<OPTION VALUE="0" SELECTED>Java Engineer - Sun - Bruxelles - Belgium</OPTION>'
  122.             +  '</SELECT><font color="#FF0000" size="3"><B> * </B></font>'
  123.             +  '<INPUT TYPE="submit" NAME="qualifications" VALUE="New"'
  124.       +  ' ID="qualifications' + num + '"></TD>';
  125.  if (fieldValues[3] == true){
  126.   //used to know if the checkbox was checked or not
  127.     strReturn = strReturn + '<TD width ="30">'
  128.      + '<INPUT TYPE="CHECKBOX" NAME="course_attended-'
  129.       + num + '" VALUE="course_attended-' + num
  130.         + '" ID="course_attended' + num + '" CHECKED>';
  131.  }
  132.  else{
  133.     strReturn = strReturn + '<TD width="30">'
  134.      + '<INPUT TYPE="CHECKBOX" NAME="course_attended-'
  135.       + num + '" VALUE="course_attended-' + num
  136.         + '" ID="course_attended' + num + '">';
  137.  }
  138.  strReturn = strReturn + '<font color="#FF0000" size="3"><B> * </B></font></TD>';
  139.  if (fieldValues[4] == true){
  140.     strReturn = strReturn + '<TD width="35">'
  141.     + '<INPUT TYPE="CHECKBOX" NAME="diploma_obtained-'
  142.        + num + '" VALUE="diploma_obtained-' + num
  143.        + '" ID="diploma_obtained' + num +'" CHECKED>';
  144.  }
  145.  else{
  146.   strReturn = strReturn + '<TD width="35">'
  147.      + '<INPUT TYPE="CHECKBOX" NAME="diploma_obtained-'
  148.        + num + '" VALUE="diploma_obtained-' + num
  149.        + '" ID="diploma_obtained' + num +'">';
  150.  }
  151.  strReturn = strReturn + '<font color="#FF0000" size="3"><B> * </B></font></TD>';
  152.  if (fieldValues[5] == true){
  153.     strReturn = strReturn + '<TD><INPUT TYPE="CHECKBOX" NAME="distinction-'
  154.     + num + '" VALUE="distinction-' + num + '" ID="distinction'
  155.        + num + '" CHECKED></TD>';
  156.  }
  157.  else{
  158.   strReturn = strReturn + '<TD><INPUT TYPE="CHECKBOX" NAME="distinction-'
  159.     + num + '" VALUE="distinction-' + num + '" ID="distinction'
  160.        + num +'"></TD>';
  161.  }
  162.  strReturn = strReturn + '<TD><INPUT TYPE="TEXT" NAME="dissertation-' + num
  163.     +  '" ID="dissertation' + num
  164.     +  '" VALUE="' + fieldValues[6]
  165.     +  '" SIZE="30" MAXLENGTH="100"></TD>'
  166.           + '<TD><img type="button" src="images/add_line.jpg" '
  167.     +   'onclick="insertLineQual(' + num + ');" '
  168.     +  'alt="insert a line before this one"></img></TD>';
  169.  //to avoid the user to delete the line if it's the only one in the table
  170.  if (numLinesQual > 1){
  171.  strReturn = strReturn + '<TD><img type="button" '
  172.     +  'src="images/rem_line.jpg" onclick="delLineQual(' + num
  173.      + ');" alt="remove this line"></img></TD>';
  174.  }
  175.  return(strReturn);
  176.   }
  177.   -->


add_remove_line_prof_trainings.js

Code :
  1. <!--
  2.   var nbTrain=0;
  3.   var numLinesTrain = 0; //number of lines in the table
  4.   //header for the table
  5.   HEADERTABLETRAIN = '<TR><TH><div align="center">date (dd-mm-yyyy)</div></TH>'
  6.        + '<TH><div align="center">institution</div></TH>'
  7.        + '<TH><div align="center">subject</div></TH>'
  8.        + '<TH><div align="center">module</div></TH>'
  9.        + '<TH><div align="center">technology sector</div></TH>'
  10.        + '<TH><div align="center">business sector</div></TH>'
  11.        + '<TH><div align="center">certification</div></TH>'
  12.        + '<TH></TH>'
  13.        + '<TH></TH>'
  14.           + '</TR>';
  15.   //default values used to initialize the fields
  16.   DEFVALUESTRAIN = new Array ("00-00-0000","","","","","",false);
  17.  
  18.   //function to delete the specified line
  19.   function delLineTrain( x )
  20.   {
  21.      var tb = '';
  22.      numLinesTrain--;
  23.      for( i=1; i<=nbTrain; i++ )
  24.      {
  25.         if( x != i )
  26.         {
  27.            if( i < x )
  28.            {
  29.               j = i;
  30.            }
  31.            else
  32.            {
  33.               j = i - 1;
  34.            }
  35.            //to get back the values of the fields
  36.            var savedValues = new Array(
  37.          document.getElementById('date'+i).value,
  38.                    document.getElementById('institution'+i).value,
  39.                    document.getElementById('subject'+i).value,
  40.                    document.getElementById('module'+i).value,
  41.                    document.getElementById('technology_sector'+i).value,
  42.                    document.getElementById('business_sector'+i).value,
  43.                    document.getElementById('certification'+i).value);
  44.            tb = tb + genLigneTrain( j , savedValues );
  45.         }
  46.      }
  47.      if( document.all )
  48.      {
  49.         document.getElementById('tbTrain').outerHTML =
  50.           '<table id="tbTrain" border="1">'
  51.           + HEADERTABLETRAIN + tb
  52.           + '</table>';
  53.      }
  54.      else
  55.      {
  56.         document.getElementById('tbTrain').innerHTML = HEADERTABLETRAIN + tb;
  57.      }
  58.      nbTrain--;
  59.   }
  60.   //function to insert a line
  61.   function insertLineTrain( x )
  62.   {
  63.      var tb = '';
  64.  numLinesTrain++;
  65.      for( i=1; i<=nbTrain; i++ )
  66.      {
  67.         if( x == i )
  68.         {
  69.            tb = tb + genLigneTrain( i , DEFVALUESTRAIN );
  70.         }
  71.         if( i < x )
  72.         {
  73.            j = i;
  74.         }
  75.         else
  76.         {
  77.            j = i + 1;
  78.         }
  79.         //to get back the values of the fields
  80.         var savedValues = new Array(
  81.       document.getElementById('date'+i).value,
  82.                 document.getElementById('institution'+i).value,
  83.                 document.getElementById('subject'+i).value,
  84.                 document.getElementById('module'+i).value,
  85.                 document.getElementById('technology_sector'+i).value,
  86.                 document.getElementById('business_sector'+i).value,
  87.                 document.getElementById('certification'+i).checked);
  88.         tb = tb + genLigneTrain( j , savedValues );
  89.      }
  90.      if( document.all )
  91.      {
  92.         document.getElementById('tbTrain').outerHTML =
  93.           '<table id="tbTrain" border="1">'
  94.           + HEADERTABLETRAIN + tb
  95.           + '</table>';
  96.      }
  97.      else
  98.      {
  99.         document.getElementById('tbTrain').innerHTML = HEADERTABLETRAIN + tb;
  100.      }
  101.      nbTrain++;
  102.   }
  103.   //function to initialize the table
  104.   function addTrain()
  105.   {
  106.      var tb = '';
  107.      nbTrain++;
  108.      numLinesTrain++;
  109.      tb = document.getElementById('tbTrain').innerHTML
  110.     + genLigneTrain( nbTrain , DEFVALUESTRAIN );
  111.      if( document.all )
  112.      {
  113.         document.getElementById('tbTrain').outerHTML =
  114.           '<table id="tbTrain" border="1">'
  115.           + tb + '</table>';
  116.      }
  117.      else
  118.      {
  119.         document.getElementById('tbTrain').innerHTML = tb;
  120.      }
  121.   }
  122.   function genLigneTrain( num , fieldValues )
  123.   {
  124.  var strReturn = '<tr id="tr' + num + '">'
  125.             + '<TD><INPUT TYPE="TEXT" NAME="date-' + num
  126.       +  '" ID="date' + num + '" VALUE="' + fieldValues[0]
  127.       +  '" SIZE="10" MAXLENGTH="10">'
  128.             +  '<font color="#FF0000" size="3"><B> * </B></font></TD>'
  129.             + '<TD><INPUT TYPE="TEXT" NAME="institution-' + num
  130.       +  '" ID="institution' + num + '" VALUE="' + fieldValues[1]
  131.       +  '" SIZE="20" MAXLENGTH="50">'
  132.       +  '<font color="#FF0000" size="3"><B> * </B></font></TD>'
  133.             + '<TD><INPUT TYPE="TEXT" NAME="subject-' + num
  134.       +  '" ID="subject' + num + '" VALUE="' + fieldValues[2]
  135.       +    '" SIZE="20" MAXLENGTH="50">'
  136.       + '<font color="#FF0000" size="3"><B> * </B></font></TD>'
  137.       + '<TD><INPUT TYPE="TEXT" NAME="module-' + num
  138.       +  '" ID="module' + num + '" VALUE="' + fieldValues[3]
  139.       +  '" SIZE="20" MAXLENGTH="50">'
  140.        +  '<font color="#FF0000" size="3"><B> * </B></font></TD>'
  141.       + '<TD><INPUT TYPE="TEXT" NAME="technology_sector-' + num
  142.       + '" ID="technology_sector' + num
  143.       +  '" VALUE="' + fieldValues[4]
  144.       +  '" SIZE="20" MAXLENGTH="50">'
  145.       +  '<font color="#FF0000" size="3"><B> * </B></font></TD>'
  146.       + '<TD><INPUT TYPE="TEXT" NAME="business_sector-' + num
  147.       + '" ID="business_sector' + num + '" VALUE="' + fieldValues[5]
  148.       + '" SIZE="20" MAXLENGTH="50"></TD>';
  149.  if (fieldValues[6] == true){
  150.     strReturn = strReturn + '<TD><INPUT TYPE="CHECKBOX" NAME="certification-'
  151.     + num + '" VALUE="certification-' + num + '" ID="certification'
  152.        + num + '" CHECKED></TD>';
  153.  }
  154.  else{
  155.   strReturn = strReturn + '<TD><INPUT TYPE="CHECKBOX" NAME="certification-'
  156.     + num + '" VALUE="certification-' + num + '" ID="certification'
  157.        + num +'"></TD>';
  158.  }
  159.  strReturn = strReturn + '<TD><img type="button" src="images/add_line.jpg" '
  160.     +   'onclick="insertLineTrain(' + num + ');" '
  161.     +  'alt="insert a line before this one"></img></TD>';
  162.  //to avoid the user to delete the line if it's the only one in the table
  163.  if (numLinesTrain > 1){
  164.  strReturn = strReturn + '<TD><img type="button" '
  165.     +  'src="images/rem_line.jpg" onclick="delLineTrain(' + num
  166.      + ');" alt="remove this line"></img></TD>';
  167.  }
  168.  return(strReturn);
  169.   }
  170.   -->


voilà, j'espère que l'affichage ne sera pas trop pourri parce que je n'arrive pas à voir jusqu'où je peux aller avec une ligne :(  
 
Je vais sans doute m'atteler à la modif' de ta dernière version le Barbu  :bounce:  
j'ai encore une question pratique (décidément, ce topic vire de plus ne plus franchement vers le javascript) : je voudrais ouvrir une popup lors du click sur un lien (ou un bouton) lié à un champ afin de permettre au user de choisir une valeur dans une liste (par exemple) et ensuite remplir le champ avec cette valeur. Le problème est le passage du nom du champ à remplir pour pouvoir utiliser une affectation du type :
window.opener.document.forms[0].nomChamp.value = valeurRecupérée
 
je vais faire une recherche sur le forum javascript mais si tu as une idée ...
 

n°591690
Mara's dad
Yes I can !
Posté le 16-12-2003 à 12:13:49  profilanswer
 

Avec ma nouvelle version effectivement tu va avoir un problème car je ne gère pas d'id pour chaque objet. Je passe juste 'this' à la fonction et je me débrouille avec les parentNode. Donc, quand tu clic sur un bouton de ton tableau pour ouvrir une fenêtre, il faut te débrouiller pour lui passer aussi une référence au champs de saisie à modifier.
Il faut regarder dans la doc du DOM pour trouver les méthodes qui vont bien.
Par exemple si tu as
<td>
    <input...>
    <button...></button>
</td>
 
Un clic sur le button vers une fonction avec this en paramètre.
this.parentNode est le td
this.parentNode.childNodes.item(0) est l'input !
 
Remarque sur ma dernière version.
 
Dans suppr( myNode ) par exemple, au lieu d'utiliser :
myNode.parentNode.parentNode.parentNode
pour désigner le <tbody>, je pourais faire :
document.getElementById('tb')
Ce qui serait plus lisible.
Mais çà limiterai la fonction à ce tableau. Comme c'est fait, il est possible de gérer plusieurs modèles de lignes de tableau avec les mêmes fonctions.
 
Autre remarque:
J'ai corrigé un petit bug dans la dernière version.
En fait en faisant un cloneNode du modèle de ligne, je fais une copie avec le même id :/
 
J'ai corrigé le js comme suis, pour effacer l'id après copie :
 

Code :
  1. function suppr( myNode )
  2. {
  3. // myNode.parentNode.parentNode est le parent <tr> du parent <td> du bouton <button>+</button>
  4. // myNode.parentNode.parentNode.parentNode est le parent <tbody> du parent <tr> du parent <td> du bouton <button>+</button>
  5. // Donc on supprime <tr> du bouton sur lequel on click du <tbody>.
  6. myNode.parentNode.parentNode.parentNode.removeChild( myNode.parentNode.parentNode );
  7. }
  8. function ins( myNode )
  9. {
  10. // myNode.parentNode.parentNode est le parent <tr> du parent <td> du bouton <button>+</button>
  11. // myNode.parentNode.parentNode.parentNode est le parent <tbody> du parent <tr> du parent <td> du bouton <button>+</button>
  12. // Donc on ajoute un nouveau <tr> dans le <tbody> avant le <tr> du bouton sur lequel on click.
  13. myNode.parentNode.parentNode.parentNode.insertBefore( newLine(), myNode.parentNode.parentNode );
  14. }
  15. // Ajout d'une ligne en fin de tableau
  16. function add()
  17. {
  18. // tb est le <tbody> de notre table
  19. // On lui ajoute un nouveau <tr>
  20. document.getElementById('tb').appendChild( newLine() );
  21. }
  22. function newLine()
  23. {
  24. var newTr = document.getElementById( 'newLine' ).cloneNode( true );
  25. newTr.removeAttribute( 'id' );
  26. return newTr;
  27. }
  28. function init()
  29. {
  30. // Si le tableau est vide, on ajoute une ligne.
  31. // Attention, avec MOZILLA, il ne faut même par un retour à la ligne entre <tbody> et </tbody> sinon il considère qu'il y a un child.
  32. // IE est moins strict.
  33. if( ! document.getElementById( 'tb' ).hasChildNodes() )
  34. {
  35.  add();
  36. }
  37. }


 
A+


Message édité par Mara's dad le 16-12-2003 à 12:27:20

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°591697
Mara's dad
Yes I can !
Posté le 16-12-2003 à 12:22:40  profilanswer
 

Attention !
 
Dans :

Code :
  1. <td>
  2.     <input...>
  3.     <button...></button>
  4. </td>

 
Un clic sur le button vers une fonction avec this en paramètre.
 
this.parentNode.childNodes.item(0) est l'input seulement dans IE !
Dans MOZ, c'est l'item(1). A cause du retour à la ligne et de la tabulation entre <td> et <input> !
Dans MOZ, c'est considéré comme un textNode, et c'est lui l'item(0)
 
Donc soit tu boucle sur les item en cherchant celui dont nodeName=='input', soit tu écris le HTML comme çà :

Code :
  1. <td><input...><button...></button></td>


 
Ca commence à devenir standard, mais c'est pas encore çà :/ :/ :/


Message édité par Mara's dad le 16-12-2003 à 12:24:03

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°591718
Kermit_The​_Frog
Posté le 16-12-2003 à 12:46:56  profilanswer
 

cool !
une fois encore : merci pour tes bons conseils et tes solutions ô combien efficaces !

n°593061
Mara's dad
Yes I can !
Posté le 18-12-2003 à 09:35:37  profilanswer
 

Modif dans la fonction suppr :
 
function suppr( myNode )
{
 // myNode.parentNode.parentNode est le parent <tr> du parent <td> du bouton <button>+</button>
 // Donc on supprime <tr> du bouton sur lequel on click.
 myNode.parentNode.parentNode.removeNode( true );
}
 
Pas grand chose. En fait c'est plus simple de faire removeNode() sur les node à supprimer que removeChild() sur le parent :D
 
Le booléen, c'est pour dire que tous les childs du node supprimé le sont aussi.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°593220
Mara's dad
Yes I can !
Posté le 18-12-2003 à 11:27:17  profilanswer
 

Petite erreur :fou:
removeNode() est spécifique à IE :/


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  comment faire ? insertion dynamique de lignes dans un tableau

 

Sujets relatifs
passer un tableau de type à 2 dimensions en paramètre ? comment faire[ASP.NET] affiche le resultat sur plusieurs lignes
ACCESS : nom de fichier en dynamique dans Macro TransférerFeuilleCalc[Java]Declarer des variables de maniere dynamique?
[PHP/SQL] Insertion de caractères spéciaux dans une tablephp et allocation dynamique de tableau a 2 dimensions
comment centré un tableau verticalement ...Flash : insertion dans un mail
[HTML] Insertion de caractères spéciaux ! 
Plus de sujets relatifs à : comment faire ? insertion dynamique de lignes dans un tableau


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR