使用 jQuery 的Ajax 事件。只要您的所有 Ajax 调用都是使用 jQuery 生成的,您就可以知道是否有任何 Ajax 调用未完成。
$(document).ready(function() {
var ajaxBusy = false;
$(document).ajaxStart( function() {
ajaxBusy = true;
}).ajaxStop( function() {
ajaxBusy = false;
});
});
编辑:
这样就回答了您关于“我如何知道是否有任何 Ajax 调用正在运行”的直接问题。
或者,您可以在运行模糊处理程序时禁用表单的提交按钮,然后在完成后重新启用它。
$('input#city').on('blur', function() {
var submit = $(this).closest('form').find(':submit:enabled');
submit.prop('disabled', true);
$.ajax('get/something?param=val').done(function(response) {
$('input:hidden[name="something"]').val(response);
}).always(function() {
submit.prop('disabled', false);
});
});
编辑2:
所以现在我们想要延迟表单提交,直到所有当前的 Ajax 调用都完成。我们让人们点击提交按钮,但如果有未决的 Ajax 调用,我们不会立即执行任何操作。
我们可以使用Deferred对象来帮助我们解决这个问题。
$(document).ready(function() {
var ajaxDefer = $.Deferred().resolve();
$(document).ajaxStart( function() {
ajaxDefer = $.Deferred();
}).ajaxStop( function() {
ajaxDefer.resolve();
});
$('form#find-users').on('submit', function() {
ajaxDefer.always(function() {
// Code here will always be executed as soon as there are no
// Ajax calls running.
// this points to the deferred object (ajaxDefer), so use the closure
// to carry over any variables you need.
});
});
});
当我们刚刚开始时,我们将ajaxDefer
对象设置为已解决状态。这意味着使用附加的任何功能.always()
都将立即执行。
当第一个 Ajax 调用开始时,我们将旧ajaxDefer
对象替换为尚未解析的新对象。使用附加的任何新功能ajaxDefer.always()
将推迟到以后。
当最后一个 Ajax 调用完成时,我们调用ajaxDefer.resolve()
,这会导致执行任何未执行的延迟函数。现在我们回到初始状态,任何新附加的函数都将立即执行。
当有人尝试提交表单时,创建一个匿名函数来完成这项工作并将其附加到ajaxDefer
. 它会在适当的时候被执行,这取决于是否有任何未完成的 Ajax 请求。注意你的关闭。