2009-06-10 46 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)。