DataTables自定义日期排序功能

DataTables自定义日期排序功能

问题描述:

我知道http://www.datatables.net/plug-ins/sorting请不要发布它,因为它不会帮助我。DataTables自定义日期排序功能

我期待创建一个自定义日期分类系统,以便与我们的CMS一起使用。问题是客户可以选择他们的日期格式,并且阻止正确的排序。我刚开始使用dataTables,这是我第一次尝试自定义分类系统。下面的代码收集点击正确的信息,但不会诉诸领域。

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

    function splitDate(str){ 
     if(str.indexOf("-") >= 0){ str=str.split('-'); } 
     else if(str.indexOf("/") >= 0){ str=str.split('/'); } 
     else if(str.indexOf(".") >= 0){ str=str.split('.'); } 
     else{str='';} 
     return str; 
    } 

    // Needs to pull attribute "data-format" from the table    
    if($(td).parent().parent().parent().attr('data-date-format') !== undefined && $(td).parent().parent().parent().attr('data-date-format')!=''){ 

     var format= $(td).parent().parent().parent().attr('data-date-format'); 

     var a = $(td).text(); 
     var p = splitDate(a); 
     var result ='10000000000000'; 
     if(p.length==3){ 
      switch(format){ 
       case 'm-d-Y':result = p[2]+p[0]+p[1]; break; 
       case 'm-d-y':result = p[2]+p[0]+p[1]; break; 
       case 'm/d/Y':result = p[2]+p[0]+p[1]; break; 
       case 'm/d/y':result = p[2]+p[0]+p[1]; break; 
       case 'm.d.Y':result = p[2]+p[0]+p[1]; break; 
       case 'm.d.y':result = p[2]+p[0]+p[1]; break; 
       case 'Y-m-d':result = p[0]+p[1]+p[2]; break; 
       case 'y-m-d':result = p[0]+p[1]+p[2]; break; 
       case 'Y/m/d':result = p[0]+p[1]+p[2]; break; 
       case 'y/m/d':result = p[0]+p[1]+p[2]; break; 
       case 'Y.m.d':result = p[0]+p[1]+p[2]; break; 
       case 'y.m.d':result = p[0]+p[1]+p[2]; break; 
       case 'd-m-Y':result = p[2]+p[1]+p[0]; break; 
       case 'd-m-y':result = p[2]+p[1]+p[0]; break; 
       case 'd/m/Y':result = p[2]+p[1]+p[0]; break; 
       case 'd/m/y':result = p[2]+p[1]+p[0]; break; 
       case 'd.m.Y':result = p[2]+p[1]+p[0]; break; 
       case 'd.m.y':result = p[2]+p[1]+p[0]; break; 
      } 
     } 
    }else{ var result='10000000000000';} 
    return result; 
});} 

表的代码

$("#table").dataTable({ 
    columns:[ null,null,null,{ "orderDataType": "date-custom" }]; 
} 
+0

有$'.extend('丢失,这是一个错字吗? –

+0

我知道我不能使用osort。我正在改变系统使用$ .fn.dataTable.ext.order ['date-custom ')= function(settings,col){return this.api()。column(col,{order:'index'})。nodes()。map(function(td,i){ – James

解决方案#1

  • 您应该添加-pre到您的自定义排序函数的名称,请参阅Ordering plug-in development - Pre-deformatting了解更多信息。

    $.extend($.fn.dataTableExt.oSort, { 
        "date-custom-pre":function(a){ 
         // ... skipped ... 
        } 
    }); 
    
  • 有你splitDate功能的问题。正确的代码是

    function splitDate(str){ 
        if(str.indexOf("-") >= 0){ str = str.split('-'); } 
        else if(str.indexOf("/") >= 0){ str = str.split('/'); } 
        else if(str.indexOf(".") >= 0){ str = str.split('.'); } 
        else{ str='';} 
        return str; 
    } 
    
  • 您将无法与$(this).parent().parent()访问表作为thiswindow对象。我对日期格式进行了硬编码,直到解决方法可用。

DEMO

this jsFiddle代码和演示。

解决方案#2

使用Custom data source ordering获得排序函数内部访问表。

$.fn.dataTable.ext.order['date-custom'] = function (settings, col) 
{ 
    var api = this.api(); 

    return api.column(col, {order:'index'}).nodes().map(function (td, i) { 
     function splitDate(str){ 
      if(str.indexOf("-") >= 0){ str = str.split('-'); } 
      else if(str.indexOf("/") >= 0){ str = str.split('/'); } 
      else if(str.indexOf(".") >= 0){ str = str.split('.'); } 
      else{ str='';} 
      return str; 
     } 

     var format = $(api.table().node()).attr('data-format');     
     var a = $(td).text(); 

     // Collect date from field 
     var p = splitDate(a); 
     var result ='10000000000000'; 
     if(p.length==3){ 
      switch(format){ 
       case 'm-d-Y':result = p[2]+p[0]+p[1]; break; 
       case 'm-d-y':result = p[2]+p[0]+p[1]; break; 
       case 'm/d/Y':result = p[2]+p[0]+p[1]; break; 
       case 'm/d/y':result = p[2]+p[0]+p[1]; break; 
       case 'm.d.Y':result = p[2]+p[0]+p[1]; break; 
       case 'm.d.y':result = p[2]+p[0]+p[1]; break; 
       case 'Y-m-d':result = p[0]+p[1]+p[2]; break; 
       case 'y-m-d':result = p[0]+p[1]+p[2]; break; 
       case 'Y/m/d':result = p[0]+p[1]+p[2]; break; 
       case 'y/m/d':result = p[0]+p[1]+p[2]; break; 
       case 'Y.m.d':result = p[0]+p[1]+p[2]; break; 
       case 'y.m.d':result = p[0]+p[1]+p[2]; break; 
       case 'd-m-Y':result = p[2]+p[1]+p[0]; break; 
       case 'd-m-y':result = p[2]+p[1]+p[0]; break; 
       case 'd/m/Y':result = p[2]+p[1]+p[0]; break; 
       case 'd/m/y':result = p[2]+p[1]+p[0]; break; 
       case 'd.m.Y':result = p[2]+p[1]+p[0]; break; 
       case 'd.m.y':result = p[2]+p[1]+p[0]; break; 
      } 
     } 

     return result; 
    }); 
}; 

$(document).ready(function(){ 
    var table = $('#example').DataTable({ 
     columnDefs: [ 
      { targets: 4, orderDataType: 'date-custom', type: 'string' } 
     ] 
    }); 
}); 

请注意,您需要添加列定义与columnscolumnDefs并使用下列选项orderDataType: 'date-custom', type: 'string'

DEMO

this jsFiddle代码和演示。

+0

}什么也没做 – James

+0

有一个原因,我在那里发表评论说我认为那是问题,我解决了这个问题并创建了另一个答案。当我试图从表。 – James

+0

@詹姆斯,我已经添加了更好的解决方案,请参阅**解决方案#2 ** –