Javascript 数据表-Can';t按不同于字符串类型的列进行排序

Javascript 数据表-Can';t按不同于字符串类型的列进行排序,javascript,jquery,sorting,jquery-datatables,Javascript,Jquery,Sorting,Jquery Datatables,我有一个数据表,其“date”列的类型为String。现在,当我想按它排序时,由于明显的原因,它显然没有正确排序,所以我将sType改为“date”,一切都很好。 但问题是,当我将sType从string更改为其他内容时,我无法再按此列进行排序。页面加载后的初始排序已排序,但我无法再单击该列进行排序。它的行为类似于bSortable为false,但它不是(已调试)。bSort也是如此此外,我还尝试实现自定义比较器,包括排序插件等。结果相同 你知道是什么导致了这个问题吗 编辑: My datata

我有一个数据表,其“date”列的类型为String。现在,当我想按它排序时,由于明显的原因,它显然没有正确排序,所以我将sType改为“date”,一切都很好。
但问题是,当我将sType从string更改为其他内容时,我无法再按此列进行排序。页面加载后的初始排序已排序,但我无法再单击该列进行排序。它的行为类似于bSortable为false,但它不是(已调试)。bSort也是如此
此外,我还尝试实现自定义比较器,包括排序插件等。结果相同
你知道是什么导致了这个问题吗

编辑
My datatable初始化进程:

$('#scanDataTable').dataTable({
     "bJQueryUI": true,
     "sPaginationType": "full_numbers",
     "sDom": '<""l>t<"F"fp>',
     "aaSorting": [[0, "asc"]],
     "iDisplayLength": "100",
     "aoColumnDefs": [
          {"sType": "date", "aTargets": [0]}
     ]
});
$('#scandatable')。数据表({
“bJQueryUI”:没错,
“sPaginationType”:“完整编号”,
“sDom”:“t”,
“aaSorting”:[[0,“asc”]],
“iDisplayLength”:“100”,
“aoColumnDefs”:[
{“sType”:“日期”,“目标”:[0]}
]
});
如果“sType”参数是字符串,单击列标题可在asc和desc排序之间切换(但它是字符串,因此排序不正确)。将“sType”切换为日期或字符串以外的任何内容后,单击表格标题将不起任何作用。
正如我前面提到的,我在第0列选项中尝试了“bSortable”:true,在dataTable选项中尝试了“bSort”:true,并导入了自定义排序插件,但它没有改变任何东西。我的日期格式是:17.11.2014 21:54:39。


重要提示:在对aaSorting进行了一些修改之后,我注意到asc和desc排序都是相同的,这可能意味着排序本身是问题,而不是表选项。

您的日期格式与
新日期()
数据.parse()
不兼容,这就是列排序变为“冻结”的原因当您尝试对列应用默认的
date
类型时。它试图对一堆
NaN
字符串进行排序。所以你必须自己创建一个合适的插件

下面是一个示例,
sikor date
,它将格式
dd.mm.yyyy hh:mm:ss
解析为标准UTC时间:

jQuery.extend(jQuery.fn.dataTableExt.oSort{
“sikor日期前”:功能(a){
var dateParts=a.split('.'),
时间=a.split(“”)[1]。split(“:”),
年份=parseInt(日期部分[2])-1900,
month=parseInt(dateParts[1])-1,
day=parseInt(日期部分[0]),
小时=parseInt(时间[0]),
分钟=parseInt(时间[1]),
secs=parseInt(时间[2]);
返回日期。UTC(年、月、日、小时、分钟、秒);
},
“sikor date asc”:功能(a、b){
回报率((ab)?1:0);
},
“sikor日期描述”:功能(a、b){
回报率((ab)?-1:0);
}
});
将整个日期字符串拆分为逻辑部分,解析为整数,然后使用转换为可比较的数字

演示->

此排序插件应适用于所有版本的dataTables。把它当作

“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>

17.11.2014 21:54:39
18.11.2013 21:54:39
17.11.2014 1:54:39        
17.11.2014 1:54:38                
16.11.2014 22:54:39        
16.11.2015 00:00:00                

“有什么想法可能会导致问题?”当我们没有任何代码可查看时,无法说出:)请将您的脚本和标记示例添加到问题中。我没有包含任何代码,因为实际上没有什么特别的内容可显示。它只是一个普通的最简单的数据表,但足够公平。回家后我会添加一些代码。添加了更多信息以及dataTable选项。我认为这种格式可能不兼容,所以我下载了一个插件,理论上支持多种新的日期格式,但在将sType设置为该插件类型后,没有任何更改。在销售了您的解决方案之后,我猜它也不支持我使用的日期格式。谢谢你抽出时间,这解决了我的问题。干杯。还将dateParts=a.split('.')更改为dateParts=a.split('.[0]。拆分('.'),并删除了年变量中的-1900。你能解释一下这个-1900是怎么回事吗?提前谢谢。嘿@Sikor,不客气,谢谢你接受答案!单击“Date.UTC()”上方的链接-年份预计为“1900年后的一年”。只需计算正确的日期,即与整数值相同的日期。由于3913和3914与2013年和2014年相比在年份上没有差异,因此排序当然会起作用。
month=parseInt(dateParts[1])-1。我为那个错误感到抱歉。我知道但忘了。谢谢,我现在知道了,但不是应该是+1900而不是-1900吗?这对我来说也有点奇怪,这个函数使用0-11表示数月,而使用1-31表示数天(而不是例如0-30)。