Je travaille sur une application avec un besoin ferme de l'entreprise pour afficher une table html avec jusqu'à 60 lignes et jusqu'à 50 colonnes.Cellules sélectionnables de haute performance dans une grande table - IE6
Idéalement, les utilisateurs pourraient sélectionner des cellules de tableau individuelles ou cliquer et faire glisser pour sélectionner plusieurs cellules. Mon problème est que je suis limité à utiliser IE6 pour le moment, et j'ai eu de la difficulté à trouver (ou à coder) un moyen de permettre ce type de sélection sur autant de cellules sans dégradation sévère des performances.
Ma méthode actuelle ressemble fondamentalement ceci:
$(document).ready(function() {
var selecting = false;
var colStart, rowStart;
var tableContainer = $("#tableContainer")
tableContainer.delegate("td", "mousedown", function() {
//Clear Selection
tableContainer.find("td.selected").removeClass("selected");
$(this).addClass("selected");
colStart = $(this).index();
rowStart = $(this).parents("tr").index();
selecting = true;
}).delegate("td", "mouseover", function() {
if (selecting) {
//Clear Selection
tableContainer.find("td.selected").removeClass("selected");
var theCell = $(this);
// Get the row and column numbers of the current cell
var colEnd = theCell.index();
var rowEnd = theCell.parents("tr").index();
// Account for rowEnd being smaller than rowStart
var rowSliceStart = Math.min(rowStart, rowEnd);
var rowSliceEnd = Math.max(rowStart, rowEnd);
tableContainer.find("tr").slice(rowSliceStart, rowSliceEnd + 1).each(function() {
var colSliceStart = Math.min(colStart, colEnd);
var colSliceEnd = Math.max(colStart, colEnd);
// Add the required class to the children
$(this).children().slice(colSliceStart, colSliceEnd + 1).addClass("selected");
});
}
}).delegate("td", "mouseup", function() {
selecting = false;
});
});
Est-ce que quelqu'un a des suggestions pour une méthode pour améliorer la performance de cette fonction? Je crois que l'ajout/la suppression de cours absorbe la plus grande partie des coûts indirects, alors j'espère surtout trouver des gains d'efficacité.
Nice. Pourrait également peut-être mettre en cache la liste des cellules sélectionnées pour éviter d'avoir à les retrouver entre chaque appel de gestionnaire de souris. – Ben
Pourrait également garder un cache de '$ (" tr ", tableContainer)' – Ben
@Ben Oui, vous pouvez mettre en cache (c'est difficile cependant), mais c'est à l'OP pour en construire un. Mais il y a un problème de ramassage des ordures. Si les éléments sont supprimés dans le DOM, l'entrée de cache correspondant à cet élément doit également être annulée manuellement. Ou alors, des fuites de mémoire se produisent. – Joseph