2016-11-26 1 views
0

私はテーブルへの機能性(列の値に基づいて順序を変更すること)のソートを追加するには、このjQueryのコードを使用しています:セルがネストした表を含むときに表の行をソートする方法はありますか?

$('th.sortBy').click(function(){ 
    var table = $(this).parents('table').eq(0); 
    var rows = table.find('tr:gt(0)').toArray().sort(comparer($(this).index())); 
    this.asc = !this.asc; 
    if (!this.asc){rows = rows.reverse()}; 
    for (var i = 0; i < rows.length; i++){table.append(rows[i])}; 
}); 

function comparer(index) { 
    return function(a, b) { 
     var valA = getCellValue(a, index), valB = getCellValue(b, index); 
     return $.isNumeric(valA) && $.isNumeric(valB) ? valA - valB : valA.localeCompare(valB); 
    }; 
}; 

function getCellValue(row, index){ return $(row).children('td').eq(index).html(); }; 

しかし、細胞が別のテーブルが含まれているテーブルの上に、ソートがすべて壊れる - それはとりすべてのテーブル行はネストされ、それらをすべて並べ替えます。私はもちろん、ネストされた行をテーブル内に残し、別の無関係なレベルでソートすることはしません。

この動作を修正するにはどうすればよいですか?

私は

var rows = table.children('tr:gt(0)').toArray().sort(comparer($(this).index())); 

var rows = table.find('tr:gt(0)').toArray().sort(comparer($(this).index())); 

を変更しようとしましたが、それはまだ、ネストされたものを含む行のすべてを選択し、注文します。

答えて

2

問題は.findは(非常に最初に、なぜなら:gt(0)のを除く)rows VARであっても、それらのネストされたテーブルにALLtrを取得しているということです。

私が提案できる唯一のこと、そのexambleに基づいて、セカンドレベルtr Sにクラスを使用することです...
ですから、.not()を使用してそれらをフィルタリングすることができます。

$('th.sortByOK').click(function(){ 
    var table = $(this).parents('table').eq(0); 
    var rows = table.find("tr:gt(0)").not(".secondLevel").toArray().sort(comparer($(this).index())); 
    this.asc = !this.asc; 
    if (!this.asc){rows = rows.reverse()}; 
    for (var i = 0; i < rows.length; i++){table.append(rows[i])}; 
}); 

CodePen
ことができます願って。

+0

ありがとうございました!はい、それは助けになります。私はまた、 'table.find( 'tr:gt(0):first')。parent()。children()'が動作するが、ヘッダー行が 'tbody'にあると間違って動作することを発見した。 –

関連する問題