Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.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
Php 在发出新请求时停止以前的ajax_Php_Jquery_Ajax - Fatal编程技术网

Php 在发出新请求时停止以前的ajax

Php 在发出新请求时停止以前的ajax,php,jquery,ajax,Php,Jquery,Ajax,我有剧本 $('#postinput').on('keyup',function(){ var txt=$(this).val(); $.ajax({ type: "POST", url: "action.php", data: 'txt='+txt, cache: false, context:this, success: function(html) {

我有剧本

$('#postinput').on('keyup',function(){ 
    var txt=$(this).val();

    $.ajax({
       type: "POST",
       url: "action.php",
       data: 'txt='+txt,
       cache: false,
       context:this,
       success: function(html)
       {
           alert(html);
       }

   });

});

假设有人键入a,ajax将运行。他立刻输入b、c等等。Ajax每次都运行。有没有办法在发出新请求时停止以前的请求?

您可以使用
xhr
abort()
方法。试试这个:

var currentXhr;
$('#postinput').on('keyup',function(){ 
    currentXhr && currentXhr.readyState != 4 && currentXhr.abort(); // clear previous request

    var txt = $(this).val();
    var currentXhr = $.ajax({
        type: "POST",
        url: "action.php",
        data: 'txt=' + txt,
        cache: false,
        context:this,
        success: function(html) {
            alert(html);
        }
    });
});
如果不想使用全局变量,可以将
xhr
存储在
#postinput
元素的
data-*
属性中

另一种方法是仅在用户停止键入时触发AJAX请求:

var timer;
$('#postinput').on('keyup',function(){ 
    clearTimeout(timer);

    var txt = $(this).val();
    var timer = setTimeout(function() {
        $.ajax({
            type: "POST",
            url: "action.php",
            data: 'txt=' + txt,
            cache: false,
            context:this,
            success: function(html) {
                alert(html);
            }
        });
    }, 100); // sends request 100ms after typing stops.
});

您可以使用Jquery这样做-

jaxRequests = new Array();

queueRequest = function(whatever, you, want) {
    if(ajaxRequests[ajaxRequests.length - 1]) {
        ajaxRequests[ajaxRequests.length - 1].abort();
    }

    ajaxRequests[ajaxRequests.length] = //Insert New jQuery AJAX call here.
}

为什么不在最后一次击键后只启动一个请求?可能是@Andreas的副本,我正在使用加载图像来显示处理过程
setTimeout
在加载图像show n hide时出现问题。可能与Hey tnx重复。我想问两件事。不管我想做什么。。停止ajax是一种错误的做法吗?假设我使用多个ajax。上面的代码不会影响其他代码ryt?停止AJAX并不是一件坏事。我想说,阻止过时的AJAX请求是一件非常好的事情。通过存储引用,您将仅停止处理该特定请求,其他所有请求将不受影响。