jQuery DataTables – 当date也是一个链接时,排序不起作用

我注意到,当日期也是一个链接时,英国日期排序不起作用。

示例1.( 演示 )

这里的日期是纯粹的考验。 工作完全没问题。

 01/01/01 Tarik Rashad Kidd 1 34 238 6239-0509  

示例2.( 演示 )

这里的日期也是一个链接。 根本不起作用。 虽然没有丢失任何错误。

   01/01/01 Tarik Rashad Kidd 1 34 238 6239-0509  

我还注意到,即使它们是链接,排序也适用于任何其他元素。 只有作为链接的日期才是问题。

我正在使用以下JS代码:

 // UK Date Sorting jQuery.fn.dataTableExt.oSort['uk_date-asc'] = function(a,b) { var ukDatea = a.split('/'); var ukDateb = b.split('/'); var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1; var y = (ukDateb[2] + ukDateb[1] + ukDateb[0]) * 1; return ((x  y) ? 1 : 0)); }; jQuery.fn.dataTableExt.oSort['uk_date-desc'] = function(a,b) { var ukDatea = a.split('/'); var ukDateb = b.split('/'); var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1; var y = (ukDateb[2] + ukDateb[1] + ukDateb[0]) * 1; return ((x  y) ? -1 : 0)); } $(document).ready(function() { $('#table').dataTable( { "bPaginate": true, "bLengthChange": true, "bFilter": true, "aoColumnDefs" : [ { "aTargets" : ["uk-date-column"] , "sType" : "uk_date"} ] }); }); 

任何帮助非常感谢。

问题是你的排序function被额外的HTML搞糊涂了。 你应该像这样修改你的function:

 // UK Date Sorting jQuery.fn.dataTableExt.oSort['uk_date-asc'] = function(a,b) { //use text() var ukDatea = $(a).text().split('/'); var ukDateb = $(b).text().split('/'); var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1; var y = (ukDateb[2] + ukDateb[1] + ukDateb[0]) * 1; return ((x < y) ? -1 : ((x > y) ? 1 : 0)); }; jQuery.fn.dataTableExt.oSort['uk_date-desc'] = function(a,b) { //use text() var ukDatea = $(a).text().split('/'); var ukDateb = $(b).text().split('/'); var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1; var y = (ukDateb[2] + ukDateb[1] + ukDateb[0]) * 1; return ((x < y) ? 1 : ((x > y) ? -1 : 0)); } 

在这里小提琴http://jsfiddle.net/GUb2n/

您可以尝试将日期(以ISO格式)放在链接前面的不可见容器中:

 2001-01-0101/01/01 

然后字母排序应该工作。

IIRC,链接数据的不正确排序与DataTables试图从表格单元格的内容(使用简化的正则表达式)剥离HTML的方式有关,这似乎无法从单元格中完全提取日期数据。

DataTables 1.10+可以使用HTML 5数据属性来避免此问题。

如果你有一组

标签中的链接,如下所示:

 28 July 2015 

您可以向

标记添加data-order属性:

 28 July 2015 

data-order属性允许DataTable对data-order属性进行排序,并仅将

标记之间的内容用作显示数据。

(v1.9.4)此解决方案不仅修复了排序问题,还修复了过滤问题,因为通常filter与HTML匹配,因此搜索hrefdiv最终匹配所有行。

mRendermRender选项中的HTML,然后缓存结果,因为DataTables多次运行mRender函数。

JsFiddle示例

可编辑表格的警告

由于缓存机制,可编辑表可能存在问题。

步骤1

在某处包含以下javascript:

 var stripHtml = (function() { var tmpDiv = document.createElement("DIV"); return function(html) { tmpDiv.innerHTML = html; return $.trim(tmpDiv.textContent || tmpDiv.innerText); }; })(); var mRenderFactory = function (colIndex) { return function (data, type, full) { var cache = MRenderCache.getCache(full); if (type === "filter" || type === "sort" || type === "type") { return cache.getOrElse(colIndex, data, stripHtml) } return data; }; }; var MRenderCache = function () { this.full = []; } MRenderCache.getCache = function (full) { var cache = full[full.length - 1]; if (cache == null || !cache.MRenderCache) { cache = new MRenderCache(); full.push(cache); } return cache; } MRenderCache.prototype.MRenderCache = true; MRenderCache.prototype.getOrElse = function (colIndex, rawData, convert) { var result = this.full[colIndex]; if (result === undefined) { result = convert(rawData); this.full[colIndex] = result; } return result; } 

第2步

设置"mRender": mRenderFactory(i)在你希望HTML被剥离的任何列的aoColumns ,其中i是列的索引。 非常重要的是你得到正确的i因为如果你没有,那么表格将显示正常,但将对错误的列进行排序和筛选。

你的初始化代码看起来像这样:

 $(document).ready(function() { $('#example').dataTable( { "aoColumns": [ null, null, { "mRender": mRenderFactory(2) }, { "mRender": mRenderFactory(3) }, null ] } ); } );