Jquery DataTables自定义排序插件不起作用

时间:2014-09-19 16:22:13

标签: jquery datatables

我正在尝试创建一个可以更改列的排序行为的插件。列中的数据是<ul>元素。在列表的每个<li>元素中,有一些文本和十进制数字。我想根据单元格列表中的最大十进制数对表进行排序。这是一个显示插件的jsfiddle,正如您所看到的,当您对第二列进行排序时,它无法正常工作:

http://jsfiddle.net/flyingL123/1whzq1w2/3/

如果有效,降序应该是Sam(97.50),Joe(80.50),Mike(17.50),升序当然应该是相反的。根据我的调试,插件返回每个单元格的正确数值。你知道为什么不对表进行相应的排序吗?

以下是插件中的代码:

$.fn.dataTable.ext.order['number-list'] = function  ( settings, col )
{
    return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {

                    //get all numbers from the cell into an array and parseFloat each one
                    var nums = $(td).html().match(/(\d+.\d+)/);

                    if(nums){
                            nums = nums.map(function(val){return parseFloat(val, 10);});
                            return Math.max.apply(null, nums);
                    }
                    else{
                            return 0;
                    }
            } );
}

1 个答案:

答案 0 :(得分:2)

注意:此答案已完全重写。

关于dataTables自定义排序和自定义数据源
最初的答案是dataTables所谓的基于类型的排序。 dataTables诞生了基本&#34;原语的排序功能&#34;或类型:stringnumericdatehtml。默认情况下,dataTables会尝试猜测列包含哪种类型的数据,然后用户单击表标题,表将根据检测到的类型进行排序。您可以使用sType / type选项(如sType : 'string')强制类型到特定列,如果需要某种方式,或者dataTables未检测到类型正确。例如,您希望将列排序为数字,但dataTables按字母顺序排序,然后您可以设置sType : 'numeric'

显然,内置排序功能并不总能满足所有需求,例如您的示例。在这种情况下,您可以创建一个新的type,如您在原始答案中看到的或在其他自定义排序插件中看到的。例如。在方案oSorttype-pretype-desc之后将对象添加到type-asc。这些函数定义不是强制性的,而是dataTables将响应的那些函数定义。例如,type-pre - 预处理函数 - 不是强制性的,但如果在调用实际排序函数之前内容需要特殊处理,则非常有用。

dom-text(及其类似)基本上是一个独立的type-pre。如果您只是希望排序算法对列内容的某个部分进行排序,而不需要全新的排序算法,这将非常有用。 dataTables将其定义为custom data source sorting。例如,如果您有一个名称为firstname lastname的列,但想要对lastname进行排序,那么这就是您的选择。

非常好的是,您可以结合以上所有内容。默认排序,默认类型检测,强制类型,自定义排序插件和自定义数据源。

在这里我们有一个令人尴尬的部分:(我自己有很多需要特殊排序算法的情况,所以我已经所以习惯于将自定义排序插件一起猛击,我只是忽略了你想要做的事情:(我真的不记得确切的情况,但很明显我在早上9点喝咖啡时看到了你的问题,然后用自动驾驶仪上的自定义排序插件回答。

我明白为什么你在想 - 你是绝对正确的。您问题中的代码也是正确的。考虑一下我上面写的内容:您需要的是custom data source和内置排序类型numeric的组合。真正的答案是你非常接近,你只是忘了设置type,这是nessecary,因为默认的排序类型是string。所以

var myDataTable = $('#myTable').DataTable({
  "columns":[
       null,
       {"orderDataType":"number-list", type: 'numeric'} // <--- just set the type to numeric
   ],
   "order":[],
});

就是这样!这是你原来的小提琴 - &gt;的 http://jsfiddle.net/rd0p6ts8/

很抱歉这个混乱。希望你能接受答案。