DataTable 范围日期时间过滤器
DataTable Range Datetime Filter
我有一个数据表,其中填充了 ajax 响应。在响应中我得到一个字符串日期数据。我可以在数据表上写入该数据,但我无法过滤具有日期范围的数据。我已经尝试了很多方法,但我无法解决这个问题。我的一些尝试我得到“fnDraw()”没有功能或类似这样的错误。如何制作范围过滤器?
JavaScrıpt 代码:
$(document).ready(function () {
var table = $.ajax({
type: "GET",
url: '/History/GetCallbackHistory',
data: { UserId: document.getElementById("callbackuserid").value },
dataType: 'json',
success: function (obj, textstatus) {
$('#callback_table').DataTable({
"pagingType": "input",
"language":
{
"processing": "<div class='loader'>Loading...</div>",
"paginate": {
"previous": "",
"next": ""
},
},
dom: "<'row'<'container-c'pi<'permuheader'<'refresh-button'>><'tlength'l>>>"
+ "<'row'>"
+ "<'row'<'col-sm-12't>r>",
data: obj,
columns: [
{
"data": "Id"
},
{
"data": "DateCallback"
},
{
"data": "callbackId"
},
{
"data": "Task_name"
},
{
"data": "callbackStatus"
},
{
"data": "Point"
},
{
"data": "TransactionType"
},
{
"data": "DateEnd"
}
]
});
},
error: function (obj, textstatus) {
alert(obj.msg);
}
});
$("#datepicker_from").datepicker({
showOn: "button",
buttonImageOnly: false,
"onSelect": function (date) {
minDateFilter = new Date(date).getTime();
table.fnDraw();
}
}).keyup(function () {
minDateFilter = new Date(this.value).getTime();
table.fnDraw();
});
$("#datepicker_to").datepicker({
showOn: "button",
buttonImageOnly: false,
"onSelect": function (date) {
maxDateFilter = new Date(date).getTime();
table.fnDraw();
}
}).keyup(function () {
maxDateFilter = new Date(this.value).getTime();
table.fnDraw();
});
});
$.fn.dataTableExt.afnFiltering.push(
function (oSettings, aData, iDataIndex) {
if (typeof aData._date == 'undefined') {
aData._date = new Date(aData[1]).getTime();
}
if (minDateFilter && !isNaN(minDateFilter)) {
if (aData._date < minDateFilter) {
return false;
}
}
if (maxDateFilter && !isNaN(maxDateFilter)) {
if (aData._date > maxDateFilter) {
return false;
}
}
return true;
}
);
当您像这样使用 jQuery 的 ajax
时:
var table = $.ajax({ ... });
您正在将 jQuery 对象分配给您的 table
变量。您没有将 success
函数中的 DataTable 分配给 table
变量。
这就是为什么当您尝试使用 table.fnDraw()
时会收到特定错误:您的 table
不是 DataTable。 ajax 调用是 异步的 - 它不会 return 正常代码流中 success
调用的任何内容。
相反,我推荐的最简单的替代方法是重新安排您的代码以使用 DataTables 对 ajax
.
的内置支持
在这种新方法中,我们根本不需要使用 jQuery ajax
函数 - 因此我们将其从代码中完全删除。相反,我们这样做:
var table = $('#callback_table').DataTable({
"ajax": {
"method": "GET",
"url": "/History/GetCallbackHistory",
"data": {
UserId: document.getElementById("callbackuserid").value
},
"dataType": "json",
"dataSrc": ""
},
"pagingType": "input",
"language": {
"processing": "<div class='loader'>Loading...</div>",
"paginate": {
"previous": "",
"next": ""
},
},
"dom": "<'row'<'container-c'pi<'permuheader'<'refresh-button'>><'tlength'l>>>" +
"<'row'>" +
"<'row'<'col-sm-12't>r>",
"columns": [{
"data": "Id"
},
{
"data": "DateCallback"
},
{
"data": "callbackId"
},
{
"data": "Task_name"
},
{
"data": "callbackStatus"
},
{
"data": "Point"
},
{
"data": "TransactionType"
},
{
"data": "DateEnd"
}
]
});
要注意的要点是 ajax
部分:
"ajax": {
"method": "GET",
"url": "/History/GetCallbackHistory",
"data": {
UserId: document.getElementById("callbackuserid").value
},
"dataType": "json",
"dataSrc": ""
},
这是 jQuery ajax
函数的包装器。但它也使用 jQuery 的 ajax
的 DataTables 扩展:dataSrc
选项。此选项取代了旧的 data: obj
选项。它告诉 DataTables 您的 JSON 响应是一个普通数组。
完成此操作后,您的 table
变量将包含一个有效的 DataTables 对象 - 您现在可以使用 table.fnDraw();
。但最好使用此函数的现代名称:table.draw();
.
如果你有过滤问题,之后,你可以参考官方日期范围过滤示例DataTables date range filter,以确保你的方法与示例的方法相匹配(但使用你喜欢的datepicker
控件).
我有一个数据表,其中填充了 ajax 响应。在响应中我得到一个字符串日期数据。我可以在数据表上写入该数据,但我无法过滤具有日期范围的数据。我已经尝试了很多方法,但我无法解决这个问题。我的一些尝试我得到“fnDraw()”没有功能或类似这样的错误。如何制作范围过滤器?
JavaScrıpt 代码:
$(document).ready(function () {
var table = $.ajax({
type: "GET",
url: '/History/GetCallbackHistory',
data: { UserId: document.getElementById("callbackuserid").value },
dataType: 'json',
success: function (obj, textstatus) {
$('#callback_table').DataTable({
"pagingType": "input",
"language":
{
"processing": "<div class='loader'>Loading...</div>",
"paginate": {
"previous": "",
"next": ""
},
},
dom: "<'row'<'container-c'pi<'permuheader'<'refresh-button'>><'tlength'l>>>"
+ "<'row'>"
+ "<'row'<'col-sm-12't>r>",
data: obj,
columns: [
{
"data": "Id"
},
{
"data": "DateCallback"
},
{
"data": "callbackId"
},
{
"data": "Task_name"
},
{
"data": "callbackStatus"
},
{
"data": "Point"
},
{
"data": "TransactionType"
},
{
"data": "DateEnd"
}
]
});
},
error: function (obj, textstatus) {
alert(obj.msg);
}
});
$("#datepicker_from").datepicker({
showOn: "button",
buttonImageOnly: false,
"onSelect": function (date) {
minDateFilter = new Date(date).getTime();
table.fnDraw();
}
}).keyup(function () {
minDateFilter = new Date(this.value).getTime();
table.fnDraw();
});
$("#datepicker_to").datepicker({
showOn: "button",
buttonImageOnly: false,
"onSelect": function (date) {
maxDateFilter = new Date(date).getTime();
table.fnDraw();
}
}).keyup(function () {
maxDateFilter = new Date(this.value).getTime();
table.fnDraw();
});
});
$.fn.dataTableExt.afnFiltering.push(
function (oSettings, aData, iDataIndex) {
if (typeof aData._date == 'undefined') {
aData._date = new Date(aData[1]).getTime();
}
if (minDateFilter && !isNaN(minDateFilter)) {
if (aData._date < minDateFilter) {
return false;
}
}
if (maxDateFilter && !isNaN(maxDateFilter)) {
if (aData._date > maxDateFilter) {
return false;
}
}
return true;
}
);
当您像这样使用 jQuery 的 ajax
时:
var table = $.ajax({ ... });
您正在将 jQuery 对象分配给您的 table
变量。您没有将 success
函数中的 DataTable 分配给 table
变量。
这就是为什么当您尝试使用 table.fnDraw()
时会收到特定错误:您的 table
不是 DataTable。 ajax 调用是 异步的 - 它不会 return 正常代码流中 success
调用的任何内容。
相反,我推荐的最简单的替代方法是重新安排您的代码以使用 DataTables 对 ajax
.
在这种新方法中,我们根本不需要使用 jQuery ajax
函数 - 因此我们将其从代码中完全删除。相反,我们这样做:
var table = $('#callback_table').DataTable({
"ajax": {
"method": "GET",
"url": "/History/GetCallbackHistory",
"data": {
UserId: document.getElementById("callbackuserid").value
},
"dataType": "json",
"dataSrc": ""
},
"pagingType": "input",
"language": {
"processing": "<div class='loader'>Loading...</div>",
"paginate": {
"previous": "",
"next": ""
},
},
"dom": "<'row'<'container-c'pi<'permuheader'<'refresh-button'>><'tlength'l>>>" +
"<'row'>" +
"<'row'<'col-sm-12't>r>",
"columns": [{
"data": "Id"
},
{
"data": "DateCallback"
},
{
"data": "callbackId"
},
{
"data": "Task_name"
},
{
"data": "callbackStatus"
},
{
"data": "Point"
},
{
"data": "TransactionType"
},
{
"data": "DateEnd"
}
]
});
要注意的要点是 ajax
部分:
"ajax": {
"method": "GET",
"url": "/History/GetCallbackHistory",
"data": {
UserId: document.getElementById("callbackuserid").value
},
"dataType": "json",
"dataSrc": ""
},
这是 jQuery ajax
函数的包装器。但它也使用 jQuery 的 ajax
的 DataTables 扩展:dataSrc
选项。此选项取代了旧的 data: obj
选项。它告诉 DataTables 您的 JSON 响应是一个普通数组。
完成此操作后,您的 table
变量将包含一个有效的 DataTables 对象 - 您现在可以使用 table.fnDraw();
。但最好使用此函数的现代名称:table.draw();
.
如果你有过滤问题,之后,你可以参考官方日期范围过滤示例DataTables date range filter,以确保你的方法与示例的方法相匹配(但使用你喜欢的datepicker
控件).