【问题标题】:daterangepicker plug on datatable. Can't sort and search数据表上的 daterangepicker 插件。无法排序和搜索
【发布时间】:2015-11-17 09:41:38
【问题描述】:

我的问题是关于 Datatable 上的 Daterangepicker。

我找到了一个集成解决方案的人,实际上它运行良好。

http://webdevgirl.co.za/

很遗憾,页面初始化时搜索和排序不起作用。

但是当您使用输入 daterangepicker 执行搜索然后您想要排序或搜索时:它可以工作!!

我不太擅长 JS,这就是为什么我需要你的帮助!

这是我想做的一个例子:

https://jsfiddle.net/5qknp86r/

JS:

        $(document).ready(function() {
    //DATATABLE
    //To display datatable without search and page length select, and to still have pagination work, instantiate like so
    var oTable=$('#table_id').dataTable({

        //"sDom":"tp",
        "pageLength": 10,
        "pagination":true,
            // Date Sorting
        columnDefs: [
           { type: 'date-eu', targets: 1}
         ],
     //// order table onload
"order": [[ 1, 'desc' ]],
    });
//DATE RANGE
//set global vars that are set by daterange picker, to be used by datatable
var startdate;
var enddate;
//instantiate datepicker and choose your format of the dates
$('#reportrange').daterangepicker({
        ranges: {
           "Aujourd'hui": [moment(), moment()],
           'Hier': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
           'Les 7 derniers jours': [moment().subtract(6, 'days'), moment()],
           'Les 30 derniers jours': [moment().subtract(29, 'days'), moment()],
           'Ce mois-ci': [moment().startOf('month'), moment().endOf('month')],
           'Le mois dernier': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
        }
,
    "opens": "right",
    format: 'DD/MM/YYYY'

},
function(start, end,label) {
// Parse it to a moment
var s = moment(start.toISOString());
var e = moment(end.toISOString());
startdate = s.format("YYYY-MM-DD");
enddate = e.format("YYYY-MM-DD");
});
//Filter the datatable on the datepicker apply event
$('#reportrange').on('apply.daterangepicker', function(ev, picker) {
startdate=picker.startDate.format('YYYY-MM-DD');
enddate=picker.endDate.format('YYYY-MM-DD');
oTable.fnDraw();
});

$.fn.dataTableExt.afnFiltering.push(
function( oSettings, aData, iDataIndex ) {
if(startdate!=undefined){
// 0 here is the column where my dates are.
//Convert to YYYY-MM-DD format from DD/MM/YYYY
var coldate = aData[1].split("/");
var d = new Date(coldate[2], coldate[1]-1 , coldate[0]);
var date = moment(d.toISOString());
date =    date.format("YYYY-MM-DD");

//Remove hyphens from dates
dateMin=startdate.replace(/-/g, "");
dateMax=enddate.replace(/-/g, "");
date=date.replace(/-/g, "");

//console.log(dateMin, dateMax, date);

// run through cases to filter results
if ( dateMin == "" && date <= dateMax){
return true;
}
else if ( dateMin =="" && date <= dateMax ){
return true;
}
else if ( dateMin <= date && "" == dateMax ){
return true;
}
else if ( dateMin <= date && date <= dateMax ){
return true;
}

// all failed
return false;
}
}
);


} );

请帮忙!

谢谢大家(对不起我的英语不好)

【问题讨论】:

    标签: javascript jquery twitter-bootstrap-3 datatable daterangepicker


    【解决方案1】:

    只需添加此功能

    $.fn.dataTableExt.afnFiltering.push(...

    进入

    $('#reportrange').on('apply.daterangepicker', function (ev, picker) {...

    像这样:

    $(document).ready(function () {
                //DATATABLE
                //To display datatable without search and page length select, and to still have pagination work, instantiate like so
                var oTable = $('#table_id').dataTable({
                    //"sDom":"tp",
                    "pageLength": 10,
                    "pagination": true,
                    // Date Sorting
                    columnDefs: [
                       { type: 'date-eu', targets: 1 }
                    ],
                    //// order table onload
                    "order": [[1, 'desc']],
                });
                //DATE RANGE
                //set global vars that are set by daterange picker, to be used by datatable
                var startdate;
                var enddate;
                //instantiate datepicker and choose your format of the dates
                $('#reportrange').daterangepicker({
                    ranges: {
                        "Aujourd'hui": [moment(), moment()],
                        'Hier': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
                        'Les 7 derniers jours': [moment().subtract(6, 'days'), moment()],
                        'Les 30 derniers jours': [moment().subtract(29, 'days'), moment()],
                        'Ce mois-ci': [moment().startOf('month'), moment().endOf('month')],
                        'Le mois dernier': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
                    }
                ,
                    "opens": "right",
                    format: 'DD/MM/YYYY'
    
                },
                function (start, end, label) {
                    // Parse it to a moment
                    var s = moment(start.toISOString());
                    var e = moment(end.toISOString());
                    startdate = s.format("YYYY-MM-DD");
                    enddate = e.format("YYYY-MM-DD");
                });
                //Filter the datatable on the datepicker apply event
                $('#reportrange').on('apply.daterangepicker', function (ev, picker) {
                    startdate = picker.startDate.format('YYYY-MM-DD');
                    enddate = picker.endDate.format('YYYY-MM-DD');
                    $.fn.dataTableExt.afnFiltering.push(
                    function (oSettings, aData, iDataIndex) {
                        if (startdate != undefined) {
                            // 0 here is the column where my dates are.
                            //Convert to YYYY-MM-DD format from DD/MM/YYYY
                            var coldate = aData[1].split("/");
                            var d = new Date(coldate[2], coldate[1] - 1, coldate[0]);
                            var date = moment(d.toISOString());
                            date = date.format("YYYY-MM-DD");
    
                            //Remove hyphens from dates
                            dateMin = startdate.replace(/-/g, "");
                            dateMax = enddate.replace(/-/g, "");
                            date = date.replace(/-/g, "");
    
                            //console.log(dateMin, dateMax, date);
    
                            // run through cases to filter results
                            if (dateMin == "" && date <= dateMax) {
                                return true;
                            }
                            else if (dateMin == "" && date <= dateMax) {
                                return true;
                            }
                            else if (dateMin <= date && "" == dateMax) {
                                return true;
                            }
                            else if (dateMin <= date && date <= dateMax) {
                                return true;
                            }
    
                            // all failed
                            return false;
                        }
                    }
                    );
    
                    oTable.fnDraw();
                });
            });
    

    这里工作JsFiddle(我希望这是你想要的)


    更新 - 第二个问题:

    对于你的第二个问题,你在

    中有错误的 aData
    $('#reportrange2').on('apply.daterangepicker', function(ev, picker) {...
    

    ...你需要改变

    var coldate = aData[1].split("/");
    

    var coldate = aData[6].split("/");
    

    因为aData[columnNumber]

    这里是JSFiddle

    【讨论】:

    • 有效!非常感谢 !现在我想让事情复杂一点。在下面查看我的新答案!
    • 您好!我发现了另一个问题。似乎结合两列过滤日期不起作用...在这里查看我的新问题stackoverflow.com/questions/34414504/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    相关资源
    最近更新 更多