Airman31
Messages postés11Date d'inscriptionvendredi 1 décembre 2006StatutMembreDernière intervention20 juillet 2009
-
15 juil. 2009 à 18:13
Bul3
Messages postés4933Date d'inscriptionsamedi 1 juillet 2006StatutMembreDernière intervention 2 février 2015
-
16 juil. 2009 à 10:13
Tout d'abord bonjour à tous,
J'ai besoin d'un petit coup de main pour une fonction Javascript que je suis en train d'implémenter : tri à bulle sur un tableau HTML (comme dans le titre ^^)
Comment ça marche : Un tableau HTML "simple" est affiché et, lorsque l'utilisateur clique sur une des entêtes de colonnes, l'intégralité du tableau est trié en fonction des données contenues dans cette colonne. L'idée finale étant de mettre en place un systême de datagrid.
Mon code-source est à l'heure actuelle fonctionnel mais je pense qu'il est possible de faire beaucoup mieux au niveau de l'optimisation.
En effet, effectuer ce tri à bulles sur un tableau 36(colonnes)*50(lignes) engendre un temps de traitement d'environ 2,6sec . Sachant que la version finale se devra de gérer plusieurs centaines de lignes, je pense que je dois trouver un bon moyen de réduire ce timing et c'est donc là que je sollicite votre aide .
Maintenant que l'introduction est effectuée passons aux choses sérieuses : le code source !
Donc en premier le code HTML à l'origine de l'événement :
id |
FK_entities |
name |
----
0,
12,
blabla,
.
.
.
----
2,
584,
blabla
Enfin le code Javascript :
//fonction de tri à bulle
function tribulle(entitie,column,type,sens)
{
Debut = new Date();
// on recupere la reference au tableau passe en parametre (entitie)
var tableRef = entitie;
y=0;
while(tableRef.nodeName!="TABLE" && y<5)
{
tableRef=tableRef.parentNode;
y++;
}
//nombre de lignes du tableau
var nbl = tableRef.rows.length;
//instanciation de la variable de test sur l'ordonnancement
var en_desordre=true;
//tant que le tableau est desordonne
while(en_desordre)
{
en_desordre = false;
//on boucle sur els elements (lignes) du tableau
for(i=1;i<nbl-1;i++)
{
var val1 = tableRef.rows[i].cells[column].innerHTML;
var val2 = tableRef.rows[i+1].cells[column].innerHTML;
//parse les donnes en fonctions du parametre "type"
if(type=='int' || type=='integer'|| type=='tinyint' || type=='smallint' || type=='medint' || type=='bigint')
{val1=parseInt(val1);val2=parseInt(val2);}
else
if (type=='float' || type=='double' || type=='real' || type=='decimal' || type=='numeric')
{val1=parseFloat(val1);val2=parseFloat(val2);}
//si 2 lignes sont en desordre
if(val1 > val2)
{
//on clone la ligne suivant avant la ligne courante
clone(tableRef,tableRef.rows[i+1],i);
//on incremente le curseur a cause de l'injection de la nouvelle ligne
i++;
//on supprime la ligne qui a ete dupliquee
tableRef.deleteRow(i+1);
//le tableau est considere en desordre
en_desordre = true;
}
}
}
Fin = new Date();
alert((Fin-Debut)+ " ms d'execution javascript");
}
function clone(table,rows,index)
{
var len = rows.cells.length;
var newRow = table.insertRow(index);
for(y=0;y<len;y++)
{
var newCell = newRow.insertCell(y);
newCell.innerHTML = rows.cells[y].innerHTML;
}
}
Je suis preneur de tous conseils ou exemples mais sachez que je ne suis pas un pro du Javascript donc je vous demanderai juste de commenter ou expliquer vos post.