【发布时间】:2017-12-06 20:25:43
【问题描述】:
我在服务器端模式下使用 DataTables 1.10.15。
我通过 ajax 将表单的内容传递给 PHP 脚本,以便它搜索数据库:
var myTable = $('#myTable').DataTable( {
"processing": false,
"serverSide": true,
"searching": false,
"ajax": {
"url" : "/getData.php",
"data" : function ( d ) {
// Search input data
d.field1 = $('#field1').val(),
d.field2 = $('#field2').val(),
d.field3 = $('#field3').val()
},
"method" : "POST",
}
});
在向/getData.php 发起 ajax 请求之前,我有一些其他的 js 会检查至少 3 个字符输入到一个字段中。
这意味着 - 在输入 3 个字符后 - 每次 按下一个键都会发出一个 ajax 请求,因此可以有一个 ajax 请求队列。
$('#primarySearch input[type="text"]').on({
"keyup": function(e) {
// Ignore tab key.
if (e.which != 9) {
processPrimarySearch.call(this);
}
}
});
/* Handle Primary Search */
function processPrimarySearch() {
var obj = $(this),
search_id = obj.attr('id'), // e.g. #field1
search_value = obj.val(); // e.g. '123-456'
/* Wait until at least 3 characters have been entered, or user has cleared the input */
if (search_value.length >= 3 || (!search_value) ) {
myTable.draw();
}
}
每当有新的 ajax 请求产生时,我如何才能终止以前的 ajax 请求,以免它们以这种方式排队?我已阅读How can I stop all the currently ongoing Ajax queries that DataTables instance have started?,但解决方案适用于旧版本的 DataTables,并且接受的答案似乎对我不起作用。
【问题讨论】:
-
你不能。它已经在服务器脚本上处理。
-
我了解到服务器正在处理脚本getData.php。但是可以停止 ajax 请求(例如 jquery 中的
.abort())。所以我想要做的是,如果已经向getData.php提出了两个请求,它会杀死第一个请求,然后继续下一个请求。这样就没有脚本排队。该应用程序适用于每个按键,因此如果用户输入 4 个字符进行搜索,则不需要执行前 3 个搜索 - 它们可以在服务器处理它们之前被杀死。我知道这是可能的,因为它在我发布的链接上,只是针对旧数据表版本。 -
你可以设置一个标志,比如
processing,然后如果processing为真,则避免执行ajax请求,当ajax成功时,设置processing为假。 -
您还可以插入延迟以执行搜索。劫持搜索输入事件并仅在 500 毫秒间隔后触发搜索。这个问题已经被问过好几次了。我知道如果你用谷歌搜索一下就会有答案。
-
好的,谢谢。我认为关于旗帜的部分可能是我所缺少的,并且似乎是个好主意。
标签: jquery ajax datatables