1

我看到另一个有同样问题的人(jquery tablesorter ajax table 只排序一个方向),但这不是同一个原因。

我使用 jQuery Tablesorter 的一个分支(https://github.com/Mottie/tablesorter)通过自定义解析器(法国日期/时间)使用数据属性对列进行排序:

<td data-since="28-09-2012 15:41:10">
    <strong>4 jours, 16 minutes</strong> (28-09-2012 15:41:10)
</td>

我可以成功地对列进行升序排序,但是当我尝试再次单击列标题时,插件不会降序排序。

具有基本数据格式的其他列在两个方向上都正确排序。

这是基于文档和其他 stackoverflow 帖子的自定义解析器:

$(document).ready(function() {
    //https://stackoverflow.com/questions/9550354/jquery-tablesorter-plugin-secondary-hidden-sorting
    $.tablesorter.addParser({
        // set a unique id
        id: 'parseSinceColumn',
        is: function(s) {
            return /\d{1,2}-\d{1,2}-\d{1,4} \d{1,2}:\d{1,2}:\d{1,2}/.test(s);
        },
        format: function(s, table, cell, cellIndex) {
            // get data attributes from $(cell).attr('data-something');
            var cellDate = $(cell).attr('data-since');

            s = s.replace(/\-/g," ");
            s = s.replace(/:/g," ");
            s = s.split(" ");

            return new Date(s[2], s[1]-1, s[0], s[3], s[4], s[5]).getTime();
        },
        // set type, either numeric or text
        type: 'numeric'
    });
    $("#pr-table").tablesorter({
        headers : {
            3 : { sorter: 'parseSinceColumn' }
        }
    });
});

您对解决该问题的方法有任何想法吗?

非常感谢。

编辑 :

我觉得插件确实尝试排序,但结果是一样的。

这是插件的调试:

  • 第一类,成功:

按 3,1 和 dir 1 次排序(8ms)

重建表(3ms)

完成应用小部件 (0ms)

  • 第二排序,排序没有变化:

在 3,0 和 dir 0 时间(7ms)上排序

重建表(3ms)

完成应用小部件 (0ms)

4

1 回答 1

1

我终于找到了解决方案。

有两个粗略的错误:

  • 我告诉插件索引列 3 具有解析器“parseSinceColumn”,因此“is”函数应该返回 false。事实上,单元格的内容无法与正则表达式匹配,因为“s”不是数据属性的内容,因此插件无法检测到该列的解析器是否合适

    • 格式函数使用 's' 参数来解析日期。好的变量是 cellDate...

这是最终的功能片段:

$(document).ready(function() {
    //http://stackoverflow.com/questions/9550354/jquery-tablesorter-plugin-secondary-hidden-sorting
    $.tablesorter.addParser({
        // set a unique id
        id: 'parseSinceColumn',
        is: function(s) {
            return false;
        },
        format: function(s, table, cell, cellIndex) {
            var cellDate = $(cell).attr('data-since');
            // get data attributes from $(cell).attr('data-something');
            // check specific column using cellIndex
            cellDate = cellDate.replace(/\-/g," ");
            cellDate = cellDate.replace(/:/g," ");
            cellDate = cellDate.split(" ");

            return new Date(cellDate[2], cellDate[1]-1, cellDate[0], cellDate[3], cellDate[4], cellDate[5]).getTime();
        },
        // set type, either numeric or text
        type: 'numeric'
    });
    $("#pr-table").tablesorter({
        headers : {
            3 : { sorter: 'parseSinceColumn' }
        }
  });
});
于 2012-10-03T10:04:09.933 回答