Остановить дублирование Ajax Submisions?
Мне интересно, как лучше всего прекратить дублирование представлений при использовании jquery и ajax?
Я придумываю 2 возможных способа, но не уверен, что это только 2.
-
В Ajax start отключите все кнопки до завершения запроса. 2 проблемы я вижу с этим, хотя я использую диалог модели jquery, поэтому я не знаю, как легко было бы отключить эту кнопку, поскольку я не уверен, что у них есть идентификаторы. Во-вторых, если запрос зависает, у пользователя действительно нет возможности повторить попытку, так как все кнопки отключены.
-
Я смотрю на то, что называется AjaxQueue, в это время я не знаю, что мне нужно и как он работает с сайта, где плагин, по-видимому, работает для обслуживания.
http://docs.jquery.com/AjaxQueue
Edit
Я думаю, что это отскок от того, что я смотрел.
http://www.protofunc.com/scripts/jquery/ajaxManager/
Единственная проблема, с которой я вижу в этом ajaxManager, - это то, что я думаю, что мне нужно изменить все свои $.post, $.get и $.ajax на их тип.
Но что произойдет, если мне нужен специальный параметр из $.ajax? Или тот факт, что мне нравится использовать .post и .get.
Изменить 2
Я думаю, что он может принимать все варианты $.ajax. Я все еще смотрю в нее. Однако теперь я не уверен в том, могу ли я использовать один и тот же конструктор для всех запросов, которые будут использовать одни и те же параметры.
First you have to construct/configure a new Ajaxmanager
//create an ajaxmanager named someAjaxProfileName
var someManagedAjax = $.manageAjax.create('someAjaxProfileName', {
queue: true,
cacheResponse: true
});
Или мне нужно сделать это выше каждый раз?
Ответы
Ответ 1
Как установить флажок, когда пользователь нажимает кнопку? Вы удалите флаг только тогда, когда запрос AJAX завершится успешно (в complete
, который вызывается после обратных вызовов success
и error
), и вы будете отправлять запрос AJAX только в том случае, если флаг не установлен.
В связи с очередью AJAX есть плагин под названием jQuery Message Queuing, который очень хорош. Я использовал его сам.
var requestSent = false;
jQuery("#buttonID").click(function() {
if(!requestSent) {
requestSent = true;
jQuery.ajax({
url: "http://example.com",
....,
timeout: timeoutValue,
complete: function() {
...
requestSent = false;
},
});
}
});
Вы можете установить значение тайм-аута для долгосрочных запросов (значение в миллисекундах), если вы считаете, что ваш запрос имеет возможность зависания. Если происходит тайм-аут, вызывается обратный вызов error
, после которого вызывается обратный вызов complete
.
Ответ 2
Вы можете сохранить активный запрос в переменной, а затем очистить его, когда есть ответ.
var request; // Stores the XMLHTTPRequest object
$('#myButton').click(function() {
if(!request) { // Only send the AJAX request if there no current request
request = $.ajax({ // Assign the XMLHTTPRequest object to the variable
url:...,
...,
complete: function() { request = null } // Clear variable after response
});
}
});
EDIT:
Одна хорошая вещь об этом заключается в том, что вы можете отменить длительные запросы с помощью abort()
.
var request; // Stores the XMLHTTPRequest object
var timeout; // Stores timeout reference for long running requests
$('#myButton').click(function() {
if(!request) { // Only send the AJAX request if there no current request
request = $.ajax({ // Assign the XMLHTTPRequest object to the variable
url:...,
...,
complete: function() { timeout = request = null } // Clear variables after response
});
timeout = setTimeout( function() {
if(request) request.abort(); // abort request
}, 10000 ); // after 10 seconds
}
});
Ответ 3
$.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);
}
}
});