JQuery Tablesorter:emptyTo:'bottom'不适用于自定义解析器

时间:2014-09-23 07:49:09

标签: php regex tablesorter

我正在使用JQuery Tablesorter版本2.17.8对表格进行排序 我创建了一个自定义解析器来对日期进行排序,然后是一个时间,后跟一个可选的字符串。

解析器如下所示:

$.tablesorter.addParser({
id: "datetime",
is: function (s) {
    return /\d{2}\-\d{2}\-\d{2}\s\d{2}:\d{2}(door \w+)?/.test(s);
}, format: function (s) {
    arr = s.split(/[\s\-:]/);
    if(arr[0] == "") // table column is empty
        timestamp = null; 
    else {
        // Month is zero-indexed so subtract one from the month inside the constructor
        date = new Date(Date.UTC('20' + arr[2], arr[1] - 1, arr[0], arr[3], arr[4])); // Y M D H M
        timestamp = date.getTime();
    }
    console.log(timestamp);
    return timestamp;
}, type: "numeric"
});

要排序的表列的示例数据:

  • 30-04-14 09:55
  • 30-04-14 14:11门I1
  • 空单元格

解析器按预期工作,但我希望将空单元格排序到底部,这似乎不起作用。

我把它放在我的PHP文件中:

<script type="text/javascript">
{literal}
$(document).ready(function() 
{ 
    $("#betalingen").tablesorter( { 
        headers: { 
            5 : { sorter: false } },        // disable sorting for column #5
        widgets: ["saveSort", "zebra"],     // apply alternating row coloring
        sortList: [[2,0]],                  // initial sorting order for Date column = ascending (0)
        emptyTo: 'bottom'                   // empty cells are always at the bottom
        } 
    ); 
} );
{/literal}
</script>

请注意,我在这里尝试了所有选项:http://mottie.github.io/tablesorter/docs/example-option-sort-empty.html
当我删除自定义解析器(并让Tablesorter找出解析器)时,它会按预期将空单元格排序到底部,但显然列未正确排序。

任何人都知道这里发生了什么?

1 个答案:

答案 0 :(得分:1)

你需要稍微调整解析器。

  • 您实际上不需要is函数,因为您可以将解析器设置为列而不需要自动检测它。
  • 正如@karlingen指出的那样,当单元格为空时,您仍然返回已设置为null的timestamp;它被保存为null而不是空字符串。

    $.tablesorter.addParser({
        id: "datetime",
        is: function (s) {
            // no need to auto-detect
            return false;
        },
        format: function (s) {
            var date, timestamp,
                arr = s.split(/[\s\-:]/);
            if (arr[0] !== "") {
                // Month is zero-indexed so subtract one from the month inside the constructor
                date = new Date(Date.UTC('20' + arr[2], arr[1] - 1, arr[0], arr[3], arr[4])); // Y M D H M
                timestamp = date.getTime();
            }
            // is date really a date?
            return date instanceof Date && isFinite(date) ? timestamp : s;
        },
        type: "numeric"
    });