2009-06-10 45 views
0

我不是一个好的程序员,我刚开始使用jQuery。我需要一个可以扩展和折叠行的表格分类器。我的代码如下。我花了很多时间来提高执行时间。在IE中需要很多时间。我会很感激你的建议。如何提高jQuery的性能

$(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'); 
      } 
     }); 
     } 
    }); 
    }); 
}); 

下面的图片给出了一些想法。这将排序一组行。 桌面图片

回答

0

作为一个开始,我不会尝试在客户端使用JavaScript对mydata进行排序,但我会将其作为服务器端。 JavaScript不是为了提高性能而设计的,它在处理事物时会阻止浏览器。

+1

我同意你的观点的屏幕截图,但事情是,如果我用的tablesorter jQuery插件,它的表现非常出色。我想我的代码的问题是DOM修改的方式。 – vinay 2009-06-10 11:18:51

+2

@迈克尔,不同意,有很多理由你可能希望对客户端进行排序。随着JavaScript速度和库的改进,许多情况下它可以在服务器往返旅程中达到最佳状态。 – Pool 2009-06-10 11:21:02

+2

我在眨眼之间用JavaScript对不少数据进行了排序。根据我的经验,在客户端排序的速度要快于服务器排序并获取信息的速度。 – Nosredna 2009-06-10 13:43:33

3

我不完全确定你想要做什么,但是如果你想对表格进行排序,你有没有考虑过使用这个jQuery插件:http://tablesorter.com/docs/

编辑:看过你的截图(我认为你的链接应该是:http://www.freeimagehosting.net/uploads/dc95537e24.gif),我看你想做什么。这不是我在jQuery中看到的,但它是ExtJS处理得很好的东西:http://extjs.com/deploy/dev/examples/grid/grouping.html - 尽管如此,对你来说可能不是很有帮助,对不起。

0

另一种提高排序数据客户端操作性能的方法是使用HTML Bridge并与非可视化Silverlight 2组件进行互操作。这样您就可以使用托管代码(C#)来执行计算客户端。

Offcourse您必须为未安装Silverlight 2的用户提供(较慢)JavaScript替代方案。将此视为性能的“渐进式增强”(如果不使用JavaScript,请使用Silverlight)。