停止重复Ajax提交?
我想知道在使用jquery和ajax时,停止重复提交的最佳方法是什么 我提出了两种可能的方法,但不确定是否只有这两种停止重复Ajax提交?,ajax,jquery,Ajax,Jquery,我想知道在使用jquery和ajax时,停止重复提交的最佳方法是什么 我提出了两种可能的方法,但不确定是否只有这两种 在Ajax启动时,禁用所有按钮,直到请求完成。但我看到的两个问题是我使用jquery模型对话框,所以我不知道禁用这些按钮有多容易,因为我不确定它们是否有id。第二,如果请求挂起,用户实际上无法重试,因为所有按钮都已禁用 我现在正在研究一种叫做AjaxQueue的东西,我不知道它是否是我需要的,或者它是如何工作的,因为插件所在的站点显然已经停止维护了 编辑 我想这是我所看到的东西
First you have to construct/configure a new Ajaxmanager
//create an ajaxmanager named someAjaxProfileName
var someManagedAjax = $.manageAjax.create('someAjaxProfileName', {
queue: true,
cacheResponse: true
});
或者我必须每次都进行上述操作吗?您可以将活动请求存储在变量中,然后在有响应时清除它
var request; // Stores the XMLHTTPRequest object
$('#myButton').click(function() {
if(!request) { // Only send the AJAX request if there's no current request
request = $.ajax({ // Assign the XMLHTTPRequest object to the variable
url:...,
...,
complete: function() { request = null } // Clear variable after response
});
}
});
编辑:
这样做的一个好处是,您可以使用abort()
取消长时间运行的请求
当用户单击按钮时设置一个标志如何?只有当AJAX请求成功完成时(在
complete
中,在success
和error
回调后调用),您才会清除该标志,并且只有在未设置该标志的情况下,您才会发送AJAX请求
与AJAX队列相关的是一个插件,名为that is very good。我自己也用过
var requestSent = false;
jQuery("#buttonID").click(function() {
if(!requestSent) {
requestSent = true;
jQuery.ajax({
url: "http://example.com",
....,
timeout: timeoutValue,
complete: function() {
...
requestSent = false;
},
});
}
});
如果您认为您的请求可能挂起,则可以为长时间运行的请求设置超时值(值以毫秒为单位)。如果发生超时,调用
错误
回调,然后调用完成
回调。使用超时
属性不是更容易吗?或者它没有像我想的那样工作@维文-很好。除非您想在setTimeout()
中使用其他逻辑来决定是否中止,否则可以使用timeout
属性。request
变量是一个与您的答案类似的标志,但是如果需要,还可以提供abort()
功能。
$.xhrPool = {};
$.xhrPool['hash'] = []
$.ajaxSetup({
beforeSend: function(jqXHR,settings) {
var hash = settings.url+settings.data
if ( $.xhrPool['hash'].indexOf(hash) === -1 ){
jqXHR.url = settings.url;
jqXHR.data = settings.data;
$.xhrPool['hash'].push(hash);
}else{
console.log('Duplicate request cancelled!');
jqXHR.abort();
}
},
complete: function(jqXHR,settings) {
var hash = jqXHR.url+jqXHR.data
if (index > -1) {
$.xhrPool['hash'].splice(index, 1);
}
}
});
$.xhrPool = {};
$.xhrPool['hash'] = []
$.ajaxSetup({
beforeSend: function(jqXHR,settings) {
var hash = settings.url+settings.data
if ( $.xhrPool['hash'].indexOf(hash) === -1 ){
jqXHR.url = settings.url;
jqXHR.data = settings.data;
$.xhrPool['hash'].push(hash);
}else{
console.log('Duplicate request cancelled!');
jqXHR.abort();
}
},
complete: function(jqXHR,settings) {
var hash = jqXHR.url+jqXHR.data
if (index > -1) {
$.xhrPool['hash'].splice(index, 1);
}
}
});