2010-11-18 2 views
3

J'ai une fonction appelée document.ready qui parcourt une table avec environ 600 lignes générées dans ASP classique. Dans un navigateur "moderne" (Chrome, Firefox, IE9 Beta) il s'exécute en moins de 1,5-2 secondes. Dans IE6, il tourne autour de 5-7 secondes, pas bon.Bouclage jQuery via TableRows/Table Cells Performance

Fondamentalement, ce que je fais est d'ajouter la valeur des cellules dans certaines colonnes et de donner des sous-totaux. (Je sais, cela devrait être généré du côté du serveur, mais certains brainiac ont développé cela en utilisant des vues qui appellent des vues, qui appellent des vues, qui appellent des vues ...).

J'ai utilisé profileur IE9 pour essayer d'avoir une idée de l'endroit où un goulot de bouteille est et il semble être le plus profond lorsque la découverte de jQuery et chacun est appelé:

tr.find("td").each(function() { 
& 
tr.find("td").eq(ci).html(tot).css 

Je signalerai tout le code si nécessaire mais je me demandais s'il y avait un moyen plus efficace de boucler à travers des lignes et des cellules de table sans nom?

Le tableau ressemble à:

32  47  0/0 0 8 1 1     
32  47 -7 0/0 0 0 7 
Totals  -7 0/0 8 1 8 
32  47  0/0 0 2 1 1     
32  47 -7 0/0 0 3 7 
Totals  -7 0/0 5 1 8 

boucle I à travers les lignes de la table et si je trouve un (td: d'abord) = "Total", puis-je placer le tr en cours et les deux années précédentes de tr dans les variables , puis prenez les cellules et calculez les totaux et placez ces totaux dans les cellules appropriées.

Tout cela fonctionne mais comme je l'ai dit il y a un goulot de bouteille sérieux pendant la recherche et chacun.

Répondre

4

Je ne l'ai pas testé moi-même, mais il est possible que toutes les extensions de jQuery ralentissent les choses. Essayez de le faire avec javascript clair et voir si cela accélère les choses:

var rows = document.getElementById('your-table').rows; 
var num_rows = rows.length; 
for (var i = 0; i < num_rows; ++i) { 
    var cells = rows[i].cells; 
    if (cells[0].innerHTML == 'Totals') { 
     var num_cells = cells.length; 
     for (var j = 1; j < num_cells; ++j) { 
      cells[j].innerHTML = 
       (parseInt(rows[i-2].cells[j]) || 0) + 
       (parseInt(rows[i-1].cells[j]) || 0); 
     } 
    } 
} 
+0

Je vais essayer ce soir/le matin et signaler mes conclusions ... Merci! – wali

+1

+1 - Les propriétés 'rows' et' cells' sont un excellent moyen d'accélérer l'itération de la table. La seule chose que je pourrais ajouter serait de mettre en cache la ligne courante et la cellule courante dans chaque boucle 'for'. Ces recherches de propriétés s'additionnent. – user113716

+0

... en fait, je suppose que ce serait juste le rang. Pas la cellule. – user113716