[Javascript] DOM, tris de tableaux coté client ... AIDE NEDDED

DOM, tris de tableaux coté client ... AIDE NEDDED [Javascript] - Programmation

Marsh Posté le 08-07-2002 à 11:47:35    

salut!
j'essaye de faire une fonction javascript, capable de trier un tableau html par colonnes, mais coté client,
je me sers de DOM, mais j'ai des ptites galères ;  voilà mon code pour l'instant:
 
 

Code :
  1. <HTML>
  2. <HEAD>
  3. <script type="text/javascript">
  4. function sort(obj,sorted)
  5. {
  6. // le nombre de lignes du tableau ....
  7. var nblines = obj.childNodes[0].childNodes.length;
  8. // le nombre de colonnes ...
  9. var nbcols = obj.childNodes[0].childNodes[0].childNodes.length;
  10. var tableValues = new Array(nblines,nbcols);
  11. // alert(nblines + " " + nbcols);
  12. for (i=0;i<nblines;i++)
  13. {
  14.  for (j=0;j<nbcols;j++)
  15.  {
  16.   //tableValues[i,j] =  
  17.   alert(obj.childNodes[0].childNodes[i].childNodes[j].nodeValue);
  18. //   alert(tableValues[i,j]);
  19.  }
  20. }
  21. }
  22. </script>
  23. </HEAD>
  24. <BODY>
  25. <table border="1" name="ma_table" id="ma_table">
  26. <tr>
  27. <th><a href="javascript:sort(document.getElementById('ma_table'),1);">pouett</a></th>
  28. <th><a href="javascript:sort(document.getElementById('ma_table'),2);">prout</a></th>
  29. <th><a href="javascript:sort(document.getElementById('ma_table'),3);">coin</a></th>
  30. <th><a href="javascript:sort(document.getElementById('ma_table'),4);">coin</a></th>
  31. </tr>
  32. <tr>
  33. <td>121</td>
  34. <td>paparaze</td>
  35. <td>sepi</td>
  36. <td></td>
  37. </tr>
  38. <tr>
  39. <td>125</td>
  40. <td>25_9o</td>
  41. <td>zigatrik</td>
  42. <td>crik</td>
  43. </tr>
  44. </table>
  45. </BODY>
  46. </HTML>


 
ça fonctionne bien quand j'alerte le nodeName, mais quand j'alerte le nodeValue il me sort tout le temps NULL ...
or j'aimerais avoir tout ce qu'il y a entre un TD ouvrant et un fermant ....
d'ailleurs, si c'est possible, n'avoir que le vrai contenu, et pas le HTML contenu .... vous voyez ske je veux dire ? par exemple dans un <TD><p class="pouette">coincoin</p></TD> j'aimerais n'avoir que coincoin ....
bref, si vous avez un conseil une aide, ou un bon lien, je suis prenant de tout!!!
et si vous savez qu'il y a des incompatibilités par exemple avec ces  :kaola:  :fou:  :o MAC :heink:  :fou:  :gun:  dites le aussi :p
 
merci


Message édité par k666 le 08-07-2002 à 11:50:11
Reply

Marsh Posté le 08-07-2002 à 11:47:35   

Reply

Marsh Posté le 08-07-2002 à 12:10:20    


>> ça fonctionne bien quand j'alerte le nodeName, mais quand j'alerte le nodeValue il me sort tout le temps NULL ...
 
on est censé comprendre ?
 
>> or j'aimerais avoir tout ce qu'il y a entre un TD ouvrant et un fermant ....
 
node texte, par exemple. ce n'est pas 'entre', c'est en fils.
 
>> d'ailleurs, si c'est possible, n'avoir que le vrai contenu, et pas le HTML contenu .... vous voyez ske je veux dire ? par exemple dans un <TD><p class="pouette">coincoin</p></TD> j'aimerais n'avoir que coincoin ....
 
td.innerText sous ie. sous mozilla, il faut parcourir tous les fils et concaténer toutes les nodes textes.
 
>> bref, si vous avez un conseil une aide, ou un bon lien, je suis prenant de tout!!!
 
hm, w3.org ? dom core & compagnie, pour le détail des nodes et de leurs interfaces. par exemple tu t'étonnais qu'il y ait une node 'entre' le td : childNodes donne accès à toutes les nodes (commentaire, texte, html), nextSibling & co donne accès seulement aux nodes html (où l'inverse, je ne me souviens plus). bref, potasse la doc.
 
>> et si vous savez qu'il y a des incompatibilités par exemple avec ces  :kaola:  :fou:  :o MAC :heink:  :fou:  :gun:  dites le aussi :p
 
à part innerText, je vois pas.

Reply

Marsh Posté le 08-07-2002 à 12:40:43    

bon j'ai amélioré un peu mon code,
le next sibling ne me servait pas puisque je suis sur que je vais travailler sur des tableaux qui sont formatés d'une façon particulière, sans colspans ni autres ... donc pas besoin de checker vraiment au cas par cas ...
j'ai fait une fonction pour cleaner le chteumeuleu et qu'il me renvoie que le contenu détagué, pour pouvoir ainsi faire mes tris etc...
par contre pour la reconstruction du tableau, je sais pas trop comment faire ... je sais pas si reconstruire le tableau html avec du dom ou si le faire directement avec du innerHTML bourrin :s
j'ai vu qu'il y avait des fonctions du style swapNodes etc... qui sont plus ou moins compatibles entre les différents ordis .. mais bon je sais pas vraiment is ya des standards...j'ai regardé un peu sur le net, et le seul truc qui semble à peu près implémenté partout c'est le innerHTML, or c'est pas un standard  :spookie:  
donc: bah tant pis :( vous auriez pas une piste ?
 

Code :
  1. <HTML>
  2. <HEAD>
  3. <script type="text/javascript">
  4. // clean tous les tags HTML, retourne le texte contenu ...
  5. function extractValue(shitty)
  6. {
  7. if (shitty.length > 0)
  8. {
  9.  while( (shitty.indexOf("<" ) >= 0) && (shitty.indexOf(">" ) > shitty.indexOf("<" )) )
  10.  {
  11.   shitty = shitty.substr(0,shitty.indexOf("<" )) + shitty.substr(shitty.indexOf(">" )+1,shitty.length);
  12.  }
  13.  return shitty;
  14. }
  15. return;
  16. }
  17. // réorganise le tableau ...
  18. function sort(obj,sorted)
  19. {
  20. // le nombre de lignes du tableau ....
  21. var nblines = obj.childNodes[0].childNodes.length;
  22. // le nombre de colonnes ...
  23. var nbcols = obj.childNodes[0].childNodes[0].childNodes.length;
  24. // tableau servant aux tris ...
  25. var tableValues = new Array(nblines,nbcols);
  26. // tableau servant à la reconstruction ...
  27. var tableContents = new Array(nblines,nbcols);
  28. // remplissage des cases ...
  29. for (i=0;i<nblines;i++)
  30. {
  31.  for (j=0;j<nbcols;j++)
  32.  {
  33.   tableValues[i,j] = extractValue(obj.childNodes[0].childNodes[i].childNodes[j].innerHTML);
  34.   tableContents[i,j] = obj.childNodes[0].childNodes[i].childNodes[j].innerHTML;
  35.  }
  36. }
  37. }
  38. </script>
  39. </HEAD>
  40. <BODY>
  41. <table border="1" name="ma_table" id="ma_table">
  42. <tr>
  43. <th><a href="javascript:sort(document.getElementById('ma_table'),1);">pouett</a></th>
  44. <th><a href="javascript:sort(document.getElementById('ma_table'),2);">prout</a></th>
  45. <th><a href="javascript:sort(document.getElementById('ma_table'),3);">coin</a></th>
  46. <th><a href="javascript:sort(document.getElementById('ma_table'),4);">coin</a></th>
  47. </tr>
  48. <tr>
  49. <td>121</td>
  50. <td>paparaze</td>
  51. <td>sepi</td>
  52. <td></td>
  53. </tr>
  54. <tr>
  55. <td>125</td>
  56. <td>25_9o</td>
  57. <td>zigatrik</td>
  58. <td>crik</td>
  59. </tr>
  60. </table>
  61. </BODY>
  62. </HTML>

Reply

Marsh Posté le 08-07-2002 à 12:53:04    

je ne sais pas vraiment ce que tu veux faire ... on va dire que si pour c'est trier un tableau sorti par une page dynamique, je pense que c'est mieux de générer des structures js puis de créer dynamiquement le tableau html, toujours en js. pour trier ça devient simple : tu utilises sort() sur tes structures (si elles contiennent du html, tu peux dès le début générer une version 'text-only';), puis tu reconstruis le tableau (avec innerHTML, ou createElement()&co).

Reply

Marsh Posté le 08-07-2002 à 13:48:42    

pkoi tu génère pas le résultat en XML, tu le tries avec un petit <xsl:sort select="..." >, puis tu transformes le tout en XHTML.
Tu peux le faire côté client si ton browser l'accepte (nécessite d'avoir installé MSXML sir IE ou d'avoir Mozilla).
Ca a l'air relou la solution javascript

Reply

Marsh Posté le 08-07-2002 à 14:28:02    

ouais je pourrais faire ça mais le truc c que je veux modifier le moins possible mes pages, et pouvoir à tout moment enlever, ou bien aussi ne pas activer la fonctionnalité si c'est un navigateur bogué ... c pour ça que j'essaye de faire comme ça .... :jap:  
 
 
 
 
euh ...
en fait j'ai un problème avec les array sort javascript;
je sais pas comment pouvoir trier des tableaux à plusieurs dimensions, ou pouvoir garder l'historique de ce qui a été fait ...
en effet je fais mon tri sur un tableau contenant uniquement les valeurs ...
 
mais à la reconstruction, je dois utiliser ce tri pour afficher un second tableau  :(  je sais pas si je suis clair ?
 
j'aimerais par exemple, qu'au lieu de m'ordonner mon tableau, il me dise:
 
1 --> 3
2 --> 1
3 --> 2
 
etc....
qu'il me sorte l'historique de ce qu'il a fait ...
bon si quelqu'un voit ce que je veux dire ?
merci :)

Reply

Marsh Posté le 08-07-2002 à 14:43:25    

sort() prend en paramètre une fonction qui lui dit comment trier. tu peux donc créer un tableau d'indices (1 2 3 4 ...), puis appeler sort() avec une fonction qui s'occupe de déterminer comment trier (ça marche comme qsort() en C).

Reply

Marsh Posté le 09-07-2002 à 10:17:24    

allez! un ptit up! voilà où j'en suis:
j'arrive à avoir l'ordre de tri, c'est à dire que j'obtiens un tableau avec les nouvelles positions de chacun des TR ....
 
j'aimerais en fonction de cet ordre là, redéplacer les TR pour avoir mon tableau bien construit;
il y a apparemment un fonction du style swapNodes en DOM qui permet de permuter deux nodes TR; et donc je pourrais faire un truc du style swap(1,7) ; swap(2,3) etc.... mais eskil y aurait pas une façon plus propre de refabriquer un noeud DOM en lui passant un tableau de déplacements ?????
 
 
bref;
sinon le code en est là si ça peut vous servir:
 
 

Code :
  1. <HTML>
  2. <HEAD>
  3. <script type="text/javascript">
  4. var transTable;
  5. var tableValues;
  6. var tableContents;
  7. var sortedField;
  8. var cancelSort = false;
  9. /*************************************
  10. *  fonctions à 2 francs   *
  11. *************************************/
  12. // clean tous les tags HTML, retourne le texte contenu ...
  13. function extractValue(shitty)
  14. {
  15. if (shitty.length > 0)
  16. {
  17.  while( (shitty.indexOf("<" ) >= 0) && (shitty.indexOf(">" ) > shitty.indexOf("<" )) )
  18.  {
  19.   shitty = shitty.substr(0,shitty.indexOf("<" )) + shitty.substr(shitty.indexOf(">" )+1,shitty.length);
  20.  }
  21.  return shitty;
  22. }
  23. return;
  24. }
  25. // échange deux cases de tableau
  26. function swap(i, j)
  27. {
  28. if (i==j)
  29.  return !cancelSort;
  30. var t=tableValues[i];
  31. tableValues[i]=tableValues[j];
  32. tableValues[j]=t;
  33. var u = transTable[i];
  34. transTable[i] =  transTable[j];
  35. transTable[j] = u;
  36. return !cancelSort;
  37. }
  38. // algorithme de tri
  39. function quickSort1(start, end)
  40. {
  41. if (end-start > 1 && !cancelSort)
  42. {
  43.  var lastlow=start;
  44.  for (var i=start+1; i<end; ++i)
  45.  {
  46.   if (tableValues[i][sortedField]<tableValues[start][sortedField])
  47.    if (!swap(i, ++lastlow))
  48.     return;
  49.  }
  50.  if (!swap(start, lastlow))
  51.   return;
  52.  quickSort1(start, lastlow);
  53.  if (!cancelSort)
  54.   quickSort1(lastlow+1, end);
  55. }
  56. }
  57. /*************************************
  58. *  /fonctions à 2 francs\   *
  59. *************************************/
  60. // réorganise le tableau ...
  61. function quickSort(obj,sorted)
  62. {
  63. var nblines = obj.childNodes[0].childNodes.length;
  64. var nbcols = obj.childNodes[0].childNodes[0].childNodes.length;
  65. tableValues = new Array(nblines);
  66. tableContents = new Array(nblines);
  67. transTable = new Array(nblines);
  68. sortedField = sorted;
  69. for (n=1;n<nblines;n++)
  70. {
  71.  transTable[n] = n;
  72. }
  73. for (i=0;i<nblines;i++)
  74. {
  75.  tableValues[i] = new Array(nbcols);
  76.  tableContents[i] = new Array(nbcols);
  77.  for (j=0;j<nbcols;j++)
  78.  {
  79.   tableValues[i][j] = extractValue(obj.childNodes[0].childNodes[i].childNodes[j].innerHTML);
  80.   tableContents[i][j] = obj.childNodes[0].childNodes[i].childNodes[j].innerHTML;
  81.  }
  82. }
  83. quickSort1(1,nblines);
  84. for (i=1;i<nblines;i++)
  85. {
  86.  alert(transTable[i]);
  87. }
  88. }
  89. </script>
  90. </HEAD>
  91. <BODY>
  92. <table border="1" name="ma_table" id="ma_table">
  93. <tr>
  94. <th><a href="javascript:quickSort(document.getElementById('ma_table'),0);">pouett</a></th>
  95. <th><a href="javascript:quickSort(document.getElementById('ma_table'),1);">prout</a></th>
  96. <th><a href="javascript:quickSort(document.getElementById('ma_table'),2);">coin</a></th>
  97. <th><a href="javascript:quickSort(document.getElementById('ma_table'),3);">coin</a></th>
  98. </tr>
  99. <tr>
  100. <td>1</td>
  101. <td>25_9o</td>
  102. <td>zigatrik</td>
  103. <td>crik</td>
  104. </tr>
  105. <tr>
  106. <td>3</td>
  107. <td>paparaze</td>
  108. <td>sepi</td>
  109. <td></td>
  110. </tr>
  111. </table>
  112. </BODY>
  113. </HTML>

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed