关于php:使用Jquery .ajax取消正在进行的AJAX请求?

Cancel in-flight AJAX requests using Jquery .ajax?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Kill Ajax requests using JavaScript using jQuery

下面是我正在使用的简单代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$("#friend_search").keyup(function() {

    if($(this).val().length > 0) {
        obtainFriendlist($(this).val());
    } else {
        obtainFriendlist("");
    }

});

function obtainFriendlist(strseg) {

    $.ajax({
       type:"GET",
       url:"getFriendlist.php",
       data:"search="+strseg,
       success: function(msg){
        UIDisplayFriends(msg);
       }
     });
}

基本上,如果在函数obtainFriendList返回结果(并触发uiDisplayFriends(msg))之前激发了keyup事件,我需要取消飞行中的请求。我一直遇到的问题是,它们会逐渐建立起来,然后突然之间,uiDisplayFriends函数会被反复激发。

非常感谢,建议也很有帮助


$.ajax的返回值是一个可以调用操作的xhr对象。要中止该函数,您可以执行如下操作:

1
2
3
var xhr = $.ajax(...)
...
xhr.abort()

在服务器上添加一些去块也可以减轻负载,这可能是明智的。只有在用户停止键入100毫秒后,以下内容才会发送XHR调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var delay = 100,
    handle = null;

$("#friend_search").keyup(function() {
    var that = this;
    clearTimeout(handle);
    handle = setTimeout(function() {
        if($(that).val().length > 0) {
            obtainFriendlist($(that).val());
        } else {
            obtainFriendlist("");
        }
    }, delay);
});

您真正应该做的第三件事是根据请求是否仍然有效来筛选XHR响应:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var lastXHR, lastStrseg;

function obtainFriendlist(strseg) {
    // Kill the last XHR request if it still exists.
    lastXHR && lastXHR.abort && lastXHR.abort();

    lastStrseg = strseg;
    lastXHR = $.ajax({
       type:"GET",
       url:"getFriendlist.php",
       data:"search="+strseg,
       success: function(msg){

        // Only display friends if the search is the last search.
        if(lastStrseg == strseg)
          UIDisplayFriends(msg);
       }
     });
}


使用一个变量,比如isloading,通过使用beforesend(jqxhr,settings)选项for.ajax设置为true,然后使用完整的设置将变量设置回false。然后,在触发另一个Ajax调用之前,只需对该变量进行验证?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var isLoading = false;
$("#friend_search").keyup(function() {

    if (!isLoading) {
       if($(this).val().length > 0) {
           obtainFriendlist($(this).val());
       } else {
           obtainFriendlist("");
       }
    }

});

function obtainFriendlist(strseg) {

    $.ajax({
       type:"GET",
       url:"getFriendlist.php",
       beforeSend: function () { isLoading = true; },
       data:"search="+strseg,
       success: function(msg){
        UIDisplayFriends(msg);
       },
       complete: function() { isLoading = false; }
     });
}