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

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°172784
k666
dites non à petitmou
Posté le 08-07-2002 à 11:47:35  profilanswer
 

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
mood
Publicité
Posté le 08-07-2002 à 11:47:35  profilanswer
 

n°172803
youdontcar​e
Posté le 08-07-2002 à 12:10:20  profilanswer
 


>> ç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.

n°172838
k666
dites non à petitmou
Posté le 08-07-2002 à 12:40:43  profilanswer
 

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>

n°172842
youdontcar​e
Posté le 08-07-2002 à 12:53:04  profilanswer
 

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).

n°172860
chocoboy
Posté le 08-07-2002 à 13:48:42  profilanswer
 

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

n°172884
k666
dites non à petitmou
Posté le 08-07-2002 à 14:28:02  profilanswer
 

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 :)

n°172895
youdontcar​e
Posté le 08-07-2002 à 14:43:25  profilanswer
 

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).

n°173367
k666
dites non à petitmou
Posté le 09-07-2002 à 10:17:24  profilanswer
 

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>


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

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

 

Sujets relatifs
[Javascript] passage de paramètres[XML] aide sur le XML, les parsers et si possible xerces
[VB] tableaux de cstes...[Javascript] Temps de chargement (pas dans la barre d'état)
Comment créer une aide type aide windows ? kel outil ?[DOS] besoin d'aide sur la signification d'une ligne d'un batch.
[Javascript,DOM] Creer dynamiquement un lien dans une tableHTML - JAVASCRIPT : Ptit problème de syntaxe
[JavaScript] opener.close() 
Plus de sujets relatifs à : [Javascript] DOM, tris de tableaux coté client ... AIDE NEDDED


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