【问题标题】:Using jQuery tablesorter to sort mm/yy dates使用 jQuery tablesorter 对 mm/yy 日期进行排序
【发布时间】:2009-01-16 16:10:42
【问题描述】:

我正在使用 jquery tablesorter 插件对表格进行排序。在我的表格中的列中以 mm/yy 格式显示日期。

<tr>
    <td class="col-name">...</td>
    ...
    <td rel="2000" class="col-dob">10/00</td>
    ...
</tr>
<tr>
    <td class="col-name">...</td>
    ...
    <td rel="1986" class="col-dob">11/86</td>
    ...
</tr>

注意:

  • 每个单元格都有一个唯一的类
  • 日期以 mm/yy 格式显示
  • 带有日期的单元格也接收年份

我的 jQuery 代码如下:

// add parser through the tablesorter addParser method
$.tablesorter.addParser({
        // set a unique id
        id: 'user-birthdate',
        is: function(s) {
                // return false so this parser is not auto detected
                return false;
        },
        format: function(s) {
                // format your data for normalization

                var dateSplit = s.split('/');

                if(2 !== dateSplit.length)
                        return 0;

                return new Date(dateSplit[1], dateSplit[0], 1);
        },
        // set type, either numeric or text
        type: 'numeric'
});

myClass.init = function() {
        $('.module .user table').tablesorter({
                sortList: [[0,0]],     
             widgets: ['zebra'],
                headers: {
                        5: {
                                sorter:'user-birthdate'
                        }
                }
        });
}

myClass.init();

我的问题是 tableSorter 将 00 解释为 1900 年而不是 2000 年,因此排序的数据不正确。

任何线索我该如何解决这个问题?我正在使用 jQuery 1.2.6 和最新版本的 tablesorter。

【问题讨论】:

    标签: jquery tablesorter


    【解决方案1】:

    我发现,tablesorter 文档通常没有什么帮助。它看起来说了很多,但缺乏细节。

    在这种情况下,它不会告诉您解析器的函数签名。幸运的是,您可以阅读the unminified code 找到它。

    我们发现metadata 解析器这样做:

    format: function(s,table,cell) {
    

    这意味着您可以将格式方法调整为:

    format: function(s, table, cell) {
        // format your data for normalization
    
        var dateSplit = s.split('/');
        var year = $(cell).attr('rel');
    
        if(2 !== dateSplit.length)
            return 0;
    
        return new Date(year, dateSplit[0], 1);
    },
    

    或至少与此类似。我还没有实际测试过这个。但至少应该非常接近。

    【讨论】:

    • 谢谢大卫。等待周一进行测试。将在这里更新。
    • 这个解决方案解决了我的问题。谢谢大卫。
    • 这在对包含一些空白值的日期列进行排序时也很有用。感谢您发布此内容。
    【解决方案2】:

    我想你会发现你的问题是 Date 构造函数和你传递的 2 位数年份字符串没有歧义:new Date(dateSplit[1], dateSplit[0], 1);

    我认为您不能(轻松)在解析器中基于 s 访问 rel 。 s 是否包含单元格的全部内容?你能在单元格的数据中做一些事情吗:&lt;span style="display : none"&gt;CC&lt;/span&gt;MM/YY,去掉标签,然后在你的解析中结合 CC 和 YY?

    【讨论】:

    • 幸运的是,解析器函数也传递了单元对象。看我的回答。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 2023-02-10
    相关资源
    最近更新 更多