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函数会被反复激发。
非常感谢,建议也很有帮助
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; } }); } |