【问题标题】:how to improve performance in jquery如何提高jquery的性能
【发布时间】:2009-06-10 09:00:46
【问题描述】:

我不是一个优秀的程序员,我刚开始使用 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');
          }
        });
      }
    });
  });
});

下面的图片给出了一些想法。这将对一组行进行排序。 表格图片

【问题讨论】:

    标签: javascript jquery caching tablesorter


    【解决方案1】:

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

    编辑:看到你的截图(我想你的链接应该是:http://www.freeimagehosting.net/uploads/dc95537e24.gif),我明白你在做什么。这不是我在 jQuery 中看到的,但 ExtJS 处理得很好:http://extjs.com/deploy/dev/examples/grid/grouping.html - 不过可能对你没有太大帮助,抱歉。

    【讨论】:

    • 感谢您的回复。我已经尝试过这个插件,它会对所有行进行排序,而不管它属于哪个组。
    【解决方案2】:

    首先,我不会尝试在客户端使用 JavaScript 对 mydata 进行排序,但我会在服务器端进行。 JavaScript 不是为了性能而设计的,它在处理事情时会阻塞您的浏览器。

    【讨论】:

    • 我同意你的观点,但问题是如果我使用 tablesorter jquery 插件,它的性能非常好。我想我的代码的问题是 DOM 修改的方式。
    • @Michael,我不同意,有充分的理由您可能希望对客户端进行排序。随着 JavaScript 速度和库的改进,在许多情况下它可以在往返服务器的过程中达到最佳效果。
    • 眨眼间,我已经用 JavaScript 整理了相当多的数据。根据我的经验,在客户端进行排序比要求服务器进行排序并取回信息要快一个数量级。
    • 致 Nick 和 Nosredna:好的,你得到了我的投票,是的,在客户端排序应该不是问题。如今,排序不再是繁重的操作。
    【解决方案3】:

    提高排序数据客户端等操作性能的另一个选项是使用 HTML 桥并与非可视 Silverlight 2 组件进行互操作。这样您就可以使用托管代码 (C#) 在客户端进行计算。

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

    【讨论】:

      【解决方案4】:

      下图是表格截图
      demo image

      【讨论】:

      • 太小了,看不到你需要的东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 2010-10-23
      • 2012-12-03
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多