我的应用程序中有一个搜索框。我必须在用户在搜索框中键入单词时显示结果。为此,我需要中止所有先前的请求,并在网格中显示最后一个请求的结果。
因为我正在使用网格,所以网格“beforeSend”事件将覆盖jquery beforeSend事件。所以我使用下面的代码,
<script type="text/javascript">
$(function () {
$.xhrPool = [];
grid.Adaptor.prototype.beforeSend = function (jqXHR) {
$.xhrPool.push(jqXHR);
}
$.xhrPool.abortAll = function () {
$(this).each(function (i, jqXHR) {
jqXHR.abort();
$.xhrPool.splice(i, 1);
});
}
$.ajaxSetup({
complete: function (jqXHR) {
var i = $.xhrPool.indexOf(jqXHR);
if (i > -1) $.xhrPool.splice(i, 1);
}
});
})
但是,我可以在xhrPool中推送请求,但我无法中止先前的请求。
注意$.xhrPool.abortAll = function () {
当我放置一个断点时,这不会发生。
我在这里缺少什么?
答案 0 :(得分:1)
我必须在用户在搜索框中输入单词时显示结果。对于,我需要中止以前的所有请求,在网格中显示上次请求的结果。
您的代码:
$.ajaxSetup({
complete: function (jqXHR) {
var i = $.xhrPool.indexOf(jqXHR);
if (i > -1) $.xhrPool.splice(i, 1);
}
});
无法执行任何操作,因为仅当请求获得complete
或success
的响应时,此error
回调才会触发。所以,在这里堕胎没有意义。
我建议您将定时setTimeout()
与clearTimeout()
结合使用:
$(function() {
var time;
$('input').keydown(function(e){
if(time){
// before hitting the ajax
// clear the timeout if there is/are
clearTimeout(time);
}
time = setTimeout(function(){
// here put the ajax code.
},600);
});
})