2009-06-10 6 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

+2

@Michael、反対意見があります。あなたがクライアント側のものを並べ替えることを望むかもしれない理由があります。 JavaScriptの速度とライブラリが改善されたことにより、サーバーへの往復に最適なケースが多くあります。 – Pool

+2

私は目の瞬間にJavaScriptのデータをかなりソートしました。私の経験では、クライアントをソートして、サーバーに情報を並べ替えて返すように依頼するのが一層速いです。 – Nosredna

3

私はあなたが何をしようとしているかは完全にはわかりませんが、テーブルを並べ替える場合は、このjQueryプラグインを使用することを検討してください:http://tablesorter.com/docs/

EDIT:あなたのスクリーンショットを見ました(あなたのリンクは:http://www.freeimagehosting.net/uploads/dc95537e24.gifになるはずです)、私はあなたが何をしようとしているのかを見ています。これはjQueryで見たことではありませんが、ExtJSが非常にうまく処理するものです:http://extjs.com/deploy/dev/examples/grid/grouping.html - これはあまり役に立たないかもしれません。

+0

ご回答いただきありがとうございます。私はすでにこのプラグインを試しました、それはそれが属しているグループに関係なくすべての行を並べ替えるでしょう。 – vinay

0

データクライアント側の並べ替えのような操作のパフォーマンスを向上させるもう1つの方法は、HTML Bridgeを使用し、非ビジュアルSilverlight 2コンポーネントと相互運用することです。そうすれば、マネージコード(C#)を使用して計算クライアント側を行うことができます。

オフコースでは、Silverlight 2がインストールされていないユーザーに(より遅い)JavaScriptの代替手段を提供する必要があります。これをパフォーマンスの「漸進的な強化」として見てください(JavaScriptを使用しない場合は、Silverlightを使用してください)。画像の下

0
+1

あなたが必要とするものを見るには小さすぎます。 – Pool

+1

元の投稿を編集するだけで、返信として画像を投稿しないでください。 – montrealist

関連する問題