jQuery のAjax Eventsを使用します。すべての 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()
はすぐに実行されます。
ajaxDefer
最初の Ajax 呼び出しが開始されると、古いオブジェクトが解決されていない新しいオブジェクトに置き換えられます。を使用して追加された新しい関数ajaxDefer.always()
は、後で延期されます。
最後の Ajax 呼び出しが完了したら、 を呼び出しますajaxDefer.resolve()
。これにより、実行されていない遅延関数が実行されます。これで、新しくアタッチされた関数がすぐに実行される初期状態に戻りました。
誰かがフォームを送信しようとすると、その作業を行う匿名関数を作成して に添付しajaxDefer
ます。未処理の Ajax リクエストがあるかどうかに応じて、必要に応じて実行されます。閉鎖に注意してください。