jQuery、DOM操作のための偉大なJavaScriptのフレームワークとAjaxの呼び出しを行うことにより、AJAX呼び出しが進行中であるときを決定するための2つの大きなフック提供:
$.ajaxStart()
と$.ajaxStop()
これらのフックの両方がハンドラ関数を取りますこれは、ajax呼び出しが開始されようとしているとき、およびすべてのajax呼び出しが終了したときに呼び出されます。これらの関数は、ページ上の任意の要素にバインドできます。 $.ajaxStart()
ハンドラのグローバルブール値をtrueに設定し、$.ajaxStop()
ハンドラでfalseに戻すことができます。
次に、ブール値フラグをチェックして、ajaxコールが進行中かどうかを判断できます。これらの線に沿って
何か:
$(document).ajaxStart(function() {
window.ajaxBusy = true;
});
$(document).ajaxStop(function() {
window.ajaxBusy = false;
});
限りブラウザは、現在のページをロードしているとき、あなたは document.readyState
をチェックすることができ決定など。ドキュメントがロードされている間に"loading"
の文字列を返し、ロードした後に"complete"
の文字列を返します。ハンドラーをdocument.onreadystatechange
にバインドし、文書がまだ読み込まれているかどうかを示すグローバルブール値を設定することができます。このような
何か:
document.onreadystatechange = function() {
switch (document.readyState) {
case "loading":
window.documentLoading = true;
break;
case "complete":
window.documentLoading = false;
break;
default:
window.documentLoading = false;
}
}
EDIT:
それは$.ajaxStart()
と$.ajaxStop()
はjQueryのなしで起動Ajaxの呼び出しのために動作しないことが表示されます。すべてのXMLhttprequestオブジェクトには、ハンドラをアタッチできるreadystatechange
というイベントがあります。この機能を利用して、個々のコールが完了したかどうかを判断できます。未処理のコールへの参照をすべて配列にプッシュし、その配列の長さを確認する場合はsetInterval()
となります。それが1より大きい場合、外向きのajax呼び出しがあります。それは大まかなアプローチであり、それを得るための唯一の方法です。おそらくこれを行う他の方法があります。しかし、ここでは一般的なアプローチです:
// declare array to hold references to outstanding requets
window.orequets = [];
var req = XMLHttpRequest();
// open the request and send it here....
// then attach a handler to `onreadystatechange`
req.onreadystatechange = function() {
if (req.readyState != 4 || req.readyState != 3) {
// req is still in progress
orequests.push(req);
window.reqPos = orequests.length -1
} else {
window.orequests = orequests.slice(reqPos, reqPos + 1);
}
}
はあなたがそれぞれの要求名を変更することはもちろん、送信される各XMLHttpRequest()
については、上記を実行してください。次に、毎x xミリ秒実行されるsetInterval()
を実行し、長さプロパティーをorequests
にチェックします。ゼロに等しい場合、要求は発生していません。ゼロより大きい場合、依然として要求が発生しています。要求が発生していない場合は、clearInterval()
を使用して間隔をクリアするか、実行してください。
var ajaxInterval = setInterval(function() {
if (orequests.length > 0) {
// ajax calls are in progress
window.xttpBusy = true;
} else {
// ajax calls have ceased
window.xttpBusy = false;
// you could call clearInterval(ajaxInterval) here but I don't know if that's your intention
},
3000 // run every 3 seconds. (You can decide how often you want to run it)
});
私は、3年後にはまだこの基本的なアプローチを使用しているとコメントして、それは素晴らしいことだと思った! – Joel
これは本当に素晴らしいです!ありがとう!いくつかの自動テスト/ウェブサイトのスクレイピングには本当に便利です。 – Evers