Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery DataTables—在新的ajax请求启动时终止ajax请求_Jquery_Ajax_Datatables - Fatal编程技术网

Jquery DataTables—在新的ajax请求启动时终止ajax请求

Jquery DataTables—在新的ajax请求启动时终止ajax请求,jquery,ajax,datatables,Jquery,Ajax,Datatables,我在服务器端模式下使用DataTables 1.10.15 我通过ajax将表单内容传递给PHP脚本,以便它搜索数据库: var myTable = $('#myTable').DataTable( { "processing": false, "serverSide": true, "searching": false, "ajax": { "url" : "/getData.php", "data" : function (

我在服务器端模式下使用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",
    }
 });
我还有一些其他的js,它在向
/getData.php
发出ajax请求之前检查字段中输入的至少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请求,使它们不会以这种方式排队?我已经读过,但解决方案是针对旧版本的DataTables的,并且接受的答案似乎对我不起作用。

如果您使用DataTable默认提供的搜索字段,您可能希望使用。使用服务器端处理时,默认设置为400ms。但是,您有
“search”:false
,因此您不能将此选项用于您的用例

您可以提供自己的自定义
输入
元素来执行搜索。这是数据表的一个非常有效的用法但是,您应该做的不是在创建请求后中止请求,而是首先防止创建无关请求。您应该做的是取消对
myTable.draw()的调用。
在下面的示例中,我使用的是Lodash的。如果需要,可以使用另一个库中的实现。在下面的示例中,我还修改了事件处理,以检查输入字段值在击键之间是否实际发生了更改。你在检查标签,但那只是冰山一角。使用箭头键还将生成
keyup
事件。事件仅按下并释放shift键将生成一个
键向上
。下面的代码通过检查自上次笔划以来字段的值是否已更改来处理所有这些情况,如果没有更改,则忽略事件

我输入的速度足够快,如果我在下面示例中显示的字段中输入“我是一个小茶壶”,我只会在控制台上看到一次“绘图”

//我们创建一个新函数,该函数将取消对draw()函数的调用。
var debouncedDraw=u.debounce(函数(){
//myTable.draw();
控制台日志(“图纸”);
}, 500);
var prev_值=未定义;
/*处理主要搜索*/
函数processPrimarySearch(){
var obj=$(此),
search_id=obj.attr('id'),//例如#field1
search_value=obj.val();//例如“123-456”
//字段没有变化,忽略。
如果(上一个值===搜索值){
回来
}
prev_值=搜索_值;
/*等待至少输入3个字符,或者用户已清除输入*/
如果(search_value.length>=3 | |(!search_value)){
去BouncedDraw();
}
}
$(“#primarySearch输入[type=“text”]”)。在(“keyup”,processPrimarySearch)上


您不能。它已经在serverscript上处理。我知道服务器正在处理脚本getData.php。但是可以停止ajax请求(例如jquery中的
.abort()
)。因此,我试图做的是,如果对
getData.php
发出了2个请求,它会杀死第一个请求,然后继续下一个请求。这样就不会有脚本排队。应用程序在每个按键上工作,因此,如果用户输入4个字符进行搜索,则不需要执行前3次搜索-可以在服务器处理它们之前将其删除。我知道这是可能的,因为它位于我发布的链接上,只是针对一个旧的datatables版本。您可以设置一个标志,如
处理
,然后在
处理
为true时避免执行ajax请求,在ajax成功后,将
处理
设置为false。您还可以插入执行搜索的延迟。劫持搜索输入事件,并仅在间隔500毫秒后启动搜索。之前已多次询问并回答此问题。我知道有一个答案,如果你谷歌一点。好的,谢谢你。我想国旗的部分可能是我所缺少的,看起来是个好主意。太好了。有很多事情我都没有考虑过,甚至从来没有听说过去公告函数。我们将对此进行更多的调查。非常感谢。您是否可以确认我是否可以删除我为停止ajax请求排队而添加的一些代码,这些代码是
if(settings.jqXHR)settings.jqXHR.abort()-这是放在('preXhr.dt',函数(e,设置,数据)
上的
。我的思绪太长,无法发表评论,所以我编辑了我的答案。