本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Kill Ajax requests using JavaScript using jQuery
下面是我正在使用的简单代码:
$("#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对象。要中止该函数,您可以执行如下操作:
var xhr = $.ajax(...)
...
xhr.abort()
在服务器上添加一些去块也可以减轻负载,这可能是明智的。只有在用户停止键入100毫秒后,以下内容才会发送XHR调用。
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响应:
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);
}
});
}
I like what you do with the delay,that's nice.然而,如果使用者是一个Slow writer,Triggering a new ajax-request with every keystroke,是否还有风险?
它仍然是一个风险,所以你想采取一系列战略,取消老的要求和减少服务呼叫的令人厌恶的方法。a第三个screen would be validing that the output still matches the request.
优秀的。Thank you,this is very informative
使用一个变量,比如isloading,通过使用beforesend(jqxhr,settings)选项for.ajax设置为true,然后使用完整的设置将变量设置回false。然后,在触发另一个Ajax调用之前,只需对该变量进行验证?
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; }
});
}
难道这不是你的机会吗?如果在XHR返回之前使用过的类型"测试",则E,S,and T将被忽视,而服务器的反应将仅为"T"。