2016-11-26 48 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.find('tr:gt(0)').toArray().sort(comparer($(this).index())); 

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

,但它仍然選擇和訂單的所有行,包括嵌套的人的。

回答

2

的問題是,.findrows VAR得到ALLtr(除了第一個,因爲:gt(0)),即使是那些在嵌套表。

我可以建議的基礎上,該examble唯一的事情,就是在第二級使用類tr小號...
所以你可以使用.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'中,它將會出錯。 –

相關問題