简体   繁体   English

如何提高jQuery的性能

[英]how to improve performance in jquery

I'm not a good programmer and I just started using jQuery. 我不是一个好的程序员,我只是开始使用jQuery。 I need a table sorter that can expand and collapse rows. 我需要一个可以扩展和折叠行的表排序器。 My code is below. 我的代码如下。 I've spent lots of time trying to improve its execution time. 我花了很多时间试图改善其执行时间。 In IE it takes lots of time. 在IE中,这需要很多时间。 I'd appreciate your suggestions. 非常感谢您的建议。

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

image below gives some idea. 下图给出了一些想法。 this wil sort group of rows. 这将是一组行。 table image 表格图片

I'm not entirely sure what you're trying to do, but if you're trying to sort tables, have you considered using this jQuery plugin: http://tablesorter.com/docs/ ? 我不确定您要做什么,但是如果您要对表格进行排序,是否考虑过使用以下jQuery插件: http : //tablesorter.com/docs/

EDIT: having seen your screenshot (I presume your link should be to: http://www.freeimagehosting.net/uploads/dc95537e24.gif ), I see what you're trying to do. 编辑:看过您的屏幕截图(我想您的链接应该是: http : //www.freeimagehosting.net/uploads/dc95537e24.gif ),我知道您正在尝试做什么。 This isn't something I've seen in jQuery, but it's something that ExtJS handles very well: http://extjs.com/deploy/dev/examples/grid/grouping.html - that may not be very helpful to you though, sorry. 这不是我在jQuery中看到的,但ExtJS处理得很好: http : //extjs.com/deploy/dev/examples/grid/grouping.html-但这可能对您没有太大帮助不好意思

As a start, I would not trying to sort mydata with JavaScript at client-side, but I would to do it a server side. 首先,我不会尝试在客户端使用JavaScript对mydata进行排序,但会在服务器端进行。 JavaScript is not made for performance and it blocks your browser when it is processing things. JavaScript不是为了提高性能而设计的,它在处理事物时会阻塞浏览器。

Another option to improve performance of operations like sorting data client side is to use the HTML Bridge and interop with a non-visual Silverlight 2 component. 改善诸如对数据客户端进行排序等操作的性能的另一种选择是使用HTML Bridge并与非可视Silverlight 2组件互操作。 That way you can use managed code (C#) to do the calculations client side. 这样,您可以使用托管代码(C#)进行客户端计算。

Offcourse you would have to provide a (slower) JavaScript alternative to users who does not have Silverlight 2 installed. 当然,您必须为没有安装Silverlight 2的用户提供(较慢的)JavaScript替代方法。 Look at this as "progressive enhancement" of performance (use Silverlight if available, if not use JavaScript). 将其视为性能的“逐步增强”(如果可用,请使用Silverlight,如果不使用JavaScript,请使用Silverlight)。

Below image is screen shot of the table 下图是桌子的屏幕截图
demo image 演示图片

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM