[英]how to improve performance in jquery
我不是一个好的程序员,我只是开始使用jQuery。 我需要一个可以扩展和折叠行的表排序器。 我的代码如下。 我花了很多时间试图改善其执行时间。 在IE中,这需要很多时间。 非常感谢您的建议。
$(document).ready(function() {
$('table.sortable').each(function() {
var $table = $(this);
var myData = new Array(), myData1 = new Array();
var rows = $table.find('tbody > tr').get();
var rowCount = 0;
$.each(rows, function(index, row){ //arrange rows in 2 dimention array
if(($(row).children('td').eq(0).attr('class').indexOf('collapse') != -1 || $(row).children('td').eq(0).attr('class').indexOf('expand') != -1)){
myData.push(myData1);
myData1 = [];
}
myData1.push(row);
rowCount++;
if(rowCount == $(rows).length){ // to assign last group of rows
myData.push(myData1);
myData1 = [];
}
});
$table.find('th').each(function(column) {
var findSortKey;
if ($(this).is('.sort-alpha')) {
findSortKey = function($cell) {
return $cell.find('.sort-key').text().toUpperCase() +
' ' + $cell.text().toUpperCase();
};
}
else if ($(this).is('.sort-numeric')) {
findSortKey = function($cell) {
var key = parseFloat($cell.text().replace(/,/g,''));
return isNaN(key) ? 0 : key;
};
}
if (findSortKey) {
$(this).addClass('header').click(function() {
var newDirection = 1;
if ($(this).is('.headerSortUp')) {
newDirection = -1;
}
var expand = $table.find('tbody > tr > td.expand').get().length;
if(expand > 0){
$.each(myData, function(index, row) {
$.each(row, function(index1, row2) {
row2.sortKey = findSortKey($(row2).children('td').eq(column));
});
});
$.each(myData, function(index, row) {
row.sort(function(a, b) {
if($(a).children('td').eq(0).attr('class').indexOf('collapse') == -1 && $(a).children('td').eq(0).attr('class').indexOf('expand') == -1 && $(b).children('td').eq(0).attr('class').indexOf('collapse') == -1 && $(b).children('td').eq(0).attr('class').indexOf('expand') == -1 ){
return ((a.sortKey < b.sortKey) ? -newDirection : ((a.sortKey > b.sortKey) ? newDirection : 0));
}
if(navigator.userAgent.toLowerCase().indexOf('chrome') > -1){
return -1; // hack for google chromo
}
return 0;
});
});
}else{
$.each(myData, function(index, row) {
row.sortKey = findSortKey($(row[0]).children('td').eq(column));
});
myData.sort(function(a, b) {
if (a.sortKey < b.sortKey) return -newDirection;
if (a.sortKey > b.sortKey) return newDirection;
return 0;
});
}
// alternate rows goes here and updating table
var alt = true;
var altSub = true;
$.each(myData, function(index, row) {
var noRow = $(row).length;
for (var i=0; i < noRow; i++){
if($(row[0]).attr('id') == $(row[i]).attr('id')){
if(alt == true){
$(row[0]).removeClass("odd").addClass("even");
alt = !alt;
altSub =true;
}else if( alt == false){
$(row[0]).removeClass("even").addClass("odd");
alt = !alt;
altSub = true;
}
}else{
if(altSub == true){
$(row[i]).removeClass("alt_row_sub").addClass("alt_row_sub2");
altSub = !altSub;
}else if( altSub == false){
$(row[i]).removeClass("alt_row_sub2").addClass("alt_row_sub");
altSub = !altSub;
}
}
}
$table.children('tbody').append(row);
row.sortKey = null;
});
$table.find('th').removeClass('headerSortUp')
.removeClass('headerSortDown');
var $sortHead = $table.find('th').filter(':nth-child('
+ (column + 1) + ')');
if (newDirection == 1) {
$sortHead.addClass('headerSortUp');
} else {
$sortHead.addClass('headerSortDown');
}
});
}
});
});
});
下图给出了一些想法。 这将是一组行。 表格图片
我不确定您要做什么,但是如果您要对表格进行排序,是否考虑过使用以下jQuery插件: http : //tablesorter.com/docs/ ?
编辑:看过您的屏幕截图(我想您的链接应该是: http : //www.freeimagehosting.net/uploads/dc95537e24.gif ),我知道您正在尝试做什么。 这不是我在jQuery中看到的,但ExtJS处理得很好: http : //extjs.com/deploy/dev/examples/grid/grouping.html-但这可能对您没有太大帮助不好意思
首先,我不会尝试在客户端使用JavaScript对mydata进行排序,但会在服务器端进行。 JavaScript不是为了提高性能而设计的,它在处理事物时会阻塞浏览器。
改善诸如对数据客户端进行排序等操作的性能的另一种选择是使用HTML Bridge并与非可视Silverlight 2组件互操作。 这样,您可以使用托管代码(C#)进行客户端计算。
当然,您必须为没有安装Silverlight 2的用户提供(较慢的)JavaScript替代方法。 将其视为性能的“逐步增强”(如果可用,请使用Silverlight,如果不使用JavaScript,请使用Silverlight)。
下图是桌子的屏幕截图
演示图片
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.