Я почти решил это, но каким-то образом люди, похоже, все еще могут отправить форму до завершения обратных вызовов.
Я не знаю, совпадение ли это, но все люди, которым удалось отправитьон использовал Safari на Mac.
Вот метод, который я использую, было бы замечательно, если бы кто-то мог заметить изъян в логике.
Используя предложение Винсента:
// set this to zero before any ajax calls are made
var ajaxcallcounter = 0;
затем, когда я выполняю ajax-вызов, например:
// UPDATE SHIPPING BOXES
var data = 'pickup=1';
ajaxcallcounter++;
$.ajax({
type: "POST",
url: "incViewbasketShippingBoxes.php",
data: data,
success: function(response) {
$('#shippingBoxes').html(response);
ajaxcallcounter--;
}
});
Это работает нормально, у меня также есть хороший небольшой скрипт для обратной связи с пользователем - кнопка неактивна, ожидая возвращения ajaxcounters иесли это занимает больше 250 мс, отображается анимация.Как только все вызовы ajax завершены, счетчик возвращается к нулю, и кнопка отображается как обычно:
// when ajaxStart is triggered, keep an eye on the ajaxcallcounter
$(document).ajaxStart(function() {
$(".ajaxbutton").attr("disabled", "disabled");
$('#processingAlert').html(' ...calculating');
$('#processingAlert').show();
// if it's taken longer than 250ms (say) display waiting message
timer = setTimeout(function() {
$('#processingAlert').html(' ...calculating <img src="../gfx-site/ajax-loader.gif">');
}, 250);
});
// when ajaxComplete is triggered, keep an eye on the ajaxcallcounter
$(document).ajaxComplete(function() {
if (ajaxcallcounter == 0) {
$(".ajaxbutton").removeAttr("disabled");
$('#processingAlert').hide();
// cancel showing the message when the ajax call completes.
clearTimeout(timer);
}
});
Наконец, мы приходим к функции, которая должна предотвратить отправку, но неКажется, не работает:
// can we submit yet?
$('#checkoutform').submit(function() {
if (ajaxcallcounter == 0) {
return true;
}
return false;
});
Кто-нибудь может заметить, что я здесь сделал неправильно?
Спасибо!