使用客户端HTML表排序对行进行分组

时间:2010-03-24 16:57:22

标签: javascript jquery html

是否存在任何现有的表排序库,或者是否有办法配置tablesorter来对每两行进行排序?另外,有没有更好的方式来表达我的表格,以便标准行排序可以工作。

我有一个看起来像这样的html表

<table>
    <thead>
        <tr>
            <th>Header 1</th>
            <th>Header 2</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Some Data: 1</td>
            <td>Some More Data:1 </td>
        </tr>
        <tr>
            <td colspan="2">Some text about the above data that puts it in context and visually spans under both of the cells above so as not to create a weird looking table</td>
        </tr>

        <tr>
            <td>Some Data: 2</td>
            <td>Some More Data: 2</td>
        </tr>
        <tr>
            <td colspan="2">Some text about the above data 2 set that puts it in context and visually spans under both of the cells above so as not to create a weird looking table</td>
        </tr>           

    </tbody>
</table>

我正在寻找一种方法来对表格进行排序,使得表格按数据行排序,带有colspan的行与其数据一起传输并且不单独排序。

2 个答案:

答案 0 :(得分:2)

可用于逻辑(不一定是语义上)将相关行组合在一起的唯一元素是<tbody>,因为它有多个<tbody>元素是有效的。但是,由于实现了tablesorter的方式,在这种情况下,这对你没有任何帮助。

我可以在tablesorter源代码中看到一个未记录的配置选项 - appender - 它允许您指定一个函数,该函数将表进行排序,并且包含要附加到其中的已排序行的数据结构实现所需的重新排序,但我看不到任何选项,可以让你配置它在进行排序时看到的行。

如果拼图的第一部分存在,您可以使用它来限制考虑排序的行到您的实际数据行,并使用appender选项提供一个附加每个已排序行及其下一行的函数兄弟节点。

编辑:这是您需要的额外部分的快速而讨厌的实现以及使用示例:

修改buildCache方法,从第195行开始到jquery.tablesorter.js:

var rowsToSort = table.config.rowsToSort ? table.config.rowsToSort(table) : table.tBodies[0].rows;
var totalRows = rowsToSort.length,
    totalCells = (rowsToSort[0] && rowsToSort[0].cells.length) || 0,
    parsers = table.config.parsers,
    cache = {row: [], normalized: []};

适用于我的样本表的用法:

$(document).ready(function() {
    $.tablesorter.defaults.debug = true;

    // Select every other row as sorting criteria
    $.tablesorter.defaults.rowsToSort = function(table)
    {
      var rows = [];
      var allRows = table.tBodies[0].rows;
      for (var i = 0, l = allRows.length; i < l; i += 2)
      {
        rows.push(allRows[i]);
      }
      return rows;
    };

    // Append each row and its next sibling row
    $.tablesorter.defaults.appender = function (table, rows)
    {
      for (var i = 0, l = rows.length; i < l; i++)
      {
        var row = rows[i][0];
        var buddyRow = $(row).next("tr").get(0);
        table.tBodies[0].appendChild(row);
        table.tBodies[0].appendChild(buddyRow);
      }
    };

    $("table").tablesorter();
});

答案 1 :(得分:2)

有人为tablesorter开发了此功能。看看这个页面:

http://blog.pengoworks.com/index.cfm/2008/3/28/Finished-jQuery-Tablesorter-mod-for-Collapsible-Table-Rows

您需要做的就是为辅助行提供一个“expand-child”类(这是可配置的)。

完全符合您的需要。