【问题标题】:Datatables - Can't sort by column different than string type数据表 - 不能按不同于字符串类型的列排序
【发布时间】:2015-04-13 21:25:12
【问题描述】:

我有一个字符串类型的“日期”列的数据表。现在,当我想按它排序时,由于明显的原因,它显然没有正确排序,所以我将 sType 更改为“日期”,一切都很好。
然而,问题是当我将 sType 从字符串更改为其他内容时,我无法再按此列排序。页面加载后的初始排序已排序并且很好,但我无法再单击该列以对其进行排序。它的行为就像 bSortable 是假的,但它不是(调试它)。 bSort 也是如此。
此外,我尝试实现自定义比较器,包括排序插件等,结果相同。
有什么想法可能导致问题吗?

编辑
我的数据表初始化过程:

$('#scanDataTable').dataTable({
     "bJQueryUI": true,
     "sPaginationType": "full_numbers",
     "sDom": '<""l>t<"F"fp>',
     "aaSorting": [[0, "asc"]],
     "iDisplayLength": "100",
     "aoColumnDefs": [
          {"sType": "date", "aTargets": [0]}
     ]
});

如果“sType”参数是字符串,点击列标题在asc和desc排序之间切换(但它是字符串,所以排序不正确)。将“sType”切换为日期或字符串以外的任何内容后,单击表头不会执行任何操作。
正如我之前提到的,我尝试在第 0 列选项中使用 "bSortable": true 和在 dataTable 选项中使用 "bSort": true ,并导入自定义排序插件,但它没有改变任何东西。我的日期格式是:17.11.2014 21:54:39。

重要提示: 稍微弄乱了 aaSorting 之后,我注意到 asc 和 desc 排序是相同的,这可能意味着排序本身是问题,而不是表选项。

【问题讨论】:

  • "有什么可能导致问题的想法吗?" 当我们没有任何代码可以查看时,这是不可能的 :) 请添加您的脚本和标记示例问题。
  • 我没有包含任何代码,因为没有什么特别的东西可以展示。它只是一个普通的最简单的数据表,但足够公平。回家后我会添加一些代码。
  • 添加了更多信息以及 dataTable 选项。

标签: javascript jquery sorting jquery-datatables


【解决方案1】:

您的日期格式与new Date()Data.parse() 不兼容,这就是为什么当您尝试将默认的date 类型应用于列时列排序会“冻结”。它正在尝试对一堆 NaN 字符串进行排序。所以你必须自己创建一个合适的插件。

这是一个示例,sikor-date 将您的格式 dd.mm.yyyy hh:mm:ss 解析为标准 UTC 时间:

jQuery.extend( jQuery.fn.dataTableExt.oSort, {
    "sikor-date-pre": function(a) {
        var dateParts = a.split('.'),
        time = a.split(' ')[1].split(':'),
        year = parseInt(dateParts[2])-1900,
        month = parseInt(dateParts[1])-1,
        day = parseInt(dateParts[0]),
        hours = parseInt(time[0]),
        mins = parseInt(time[1]),
        secs = parseInt(time[2]);
        return Date.UTC(year, month, day, hours, mins, secs);
    },
    "sikor-date-asc": function(a, b) {
        return ((a < b) ? -1 : ((a > b) ? 1 : 0));
    },
    "sikor-date-desc": function(a,b) {
        return ((a < b) ? 1 : ((a > b) ? -1 : 0));
    }
});

整个日期字符串被拆分为逻辑部分,解析为整数,然后转换为可与Date.UTC() 比较的数字。

演示 -> http://jsfiddle.net/nm261eyn/

这个排序插件应该适用于所有版本的数据表。把它当作

"aoColumnDefs": [
    {"sType": "sikor-date", "aTargets": [0]}
]

TODO : 错误处理,检查日期是否满足要求,检查是否为空字符串"" 等。插件盲目地假设日期作为精确格式的字符串dd.mm.yyyy hh:mm:ss .

测试表:

<tbody>
    <tr><td>17.11.2014 21:54:39</td></tr>
    <tr><td>18.11.2013 21:54:39</td></tr>
    <tr><td>17.11.2014 1:54:39</td></tr>        
    <tr><td>17.11.2014 1:54:38</td></tr>                
    <tr><td>16.11.2014 22:54:39</td></tr>        
    <tr><td>16.11.2015 00:00:00</td></tr>                
</tbody>

【讨论】:

  • 我认为这种格式可能不兼容,所以我下载了一个理论上支持多种新日期格式的插件,但是在将 sType 设置为该插件类型后,没有任何变化。看到您的解决方案后,我的猜测是它也不支持我使用的日期格式。谢谢你的时间,这解决了我的问题。干杯。
  • 还将 dateParts = a.split('.') 更改为 dateParts = a.split(' ')[0].split('.') 并删除了年份变量中的 -1900。你能解释一下这个-1900是什么吗?提前致谢。
  • 嘿@Sikor,不客气,感谢您接受答案!单击“Date.UTC()”上方的链接 - 年份预计为“1900 年之后的一年”。这只是为了计算正确的日期,即与整数值相同的日期。排序当然会以任何一种方式工作,因为与 2013 年和 2014 年相比,3913 年和 3914 年之间的年份没有区别..
  • month = parseInt(dateParts[1])-1 不过,还是回答了。为那个错误感到抱歉。知道但忘记了。
  • 谢谢,我现在明白了,但不是应该是 +1900 而不是 -1900 吗?对我来说,这个函数使用 0-11 表示几个月但 1-31 表示几天(而不是 0-30 例如)对我来说也有点奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多