当用户在文本框中键入内容时,json会自动完成工作,他会向服务器发出大量请求。如何在jQuery中发出新请求时停止旧请求?
答案 0 :(得分:3)
我猜你会在json request
个对象上触发XMLHttpRequest
,或者换句话说,你正在使用.ajax()
。您通常可以使用.abort()
取消ajax请求。
var xhr = $.ajax({});
// somewhere else
if(xhr)
xhr.abort();
因为.ajax()
返回原始XHR
事件,您可以将其存储在某处并中止该请求。
当然,你必须创建一些“请求逻辑”来处理这些东西。例如:
var xhrmanager = function() {
var requests = [],
self = {};
self.create = function(params, cb){
if(typeof params === 'object') {// additional checks here
var xhr = $.ajax($.extend({
url: '/path/script.pl',
dataType: 'json',
type: 'GET',
success: function(data, status, req){
if(typeof cb === 'function')
cb.apply(this, [data]);
},
complete: function(req, status) {
var pos = $.inArray(req, requests);
if(pos > -1)
requests.splice(pos, 1)
}
}, params || {}));
}
};
self.clearAll = function(){
for(var i = 0, len = requests.length; i < len; i++){
requests[i].abort();
}
};
return self;
};
用法如:
var json_requests = xhrmanager();
json_requests.create({
data: 'some=data'
}, function(data) {
// do something
});
json_requests.clearAll();
答案 1 :(得分:0)
第一个基本的尝试是:只为请求做一个小偏移(例如100ms)。因此,每次按下一个键时,您只需要重置计时器。
例如
var timeout;
var textBox = $('#textbox');
textBox.change(function() {
if (timeout) {
clearTimeout(timeout);
}
var callingMethod = /* insert your method for the request */;
timeout = setTimeout(callingMethod, 100);
});
第二次尝试将是:请求应该是变量。每次输入请求时,逻辑都会检查变量是否为null(某种:双重锁定模式)。因此,如果变量不为null,则表示正在进行请求。因此,您可以将旧请求存储在可以取消它的变量中。
例如
var request;
function DoMagicThing() {
if (request) {
request.abort();
request = null;
}
request = $.ajax({
/* insert options here */,
complete = function() {
request = null;
}
});
}