2010-11-20 39 views
5

ブラウザが現在JavaScriptでビジー状態になっている場合には、私が得る方法を探しています。私は、現在のページが何か(ajaxまたは普通のページの読み込みを介して)、またはGreasemonkeyスクリプト、またはいくつかのJavaScript APIを使って読み込んでいる場合に、ブール値や何かを挿入するためのFirefox拡張機能を探しています(これは最良の解決策になることができますが、私が見ることができますから、その種のものはありません)。ブラウザがビジー状態になるかどうかを確認する

私はこれを行うための最良の方法は何だろうと思っていました。私はこのようなものを作るためのFirefox Addon/Greasemonkeyチュートリアルを探していましたが、何も見つかりませんでした。誰にも、私がこの問題を解決するためのより良い解決策に向けて指すことのできるヒントやリソースがありますか?

おかげ

編集:ビジーで、私はほとんどちょうどブラウザがサーバーからデータを送信または受信しているかどうかを知る必要があります。

答えて

2

ここで私は終わりに行くと思います。

var runningAjaxCount = 0; 

var oldSend = XMLHttpRequest.prototype.send; 
XMLHttpRequest.prototype.send = function() { 
    oldOnReady = this.onreadystatechange; 
    this.onreadystatechange = function() { 
     oldOnReady.call(this); 
     if(this.readyState == XMLHttpRequest.DONE) { 
      ajaxStopped(); 
     } 
    } 
    ajaxStarted(); 
    oldSend.apply(this, arguments); 
} 

function ajaxStarted() { 
    runningAjaxCount++; 
} 

function ajaxStopped() { 
    runningAjaxCount--; 
} 

function isCallingAjax() { 
    return runningAjaxCount > 0; 
} 

function isBrowserBusy() { 
    return document.readyState != "complete" && isCallingAjax(); 
} 
+0

私は、3年後にはまだこの基本的なアプローチを使用しているとコメントして、それは素晴らしいことだと思った! – Joel

+0

これは本当に素晴らしいです!ありがとう!いくつかの自動テスト/ウェブサイトのスクレイピングには本当に便利です。 – Evers

4

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) 
}); 
+0

をOPは、Firefoxの拡張機能からではなく、ウェブからこれを行う方法を尋ねた:このソリューションは、アレックスが、それは(jqueryのを含む)のXMLHttpRequestを使用して何もして動作することを除いて、jQueryのイベントと提案1のようなものですjQueryを使用するページ。 – PleaseStand

+1

私はこれらの2つの方法でjqueryドキュメントを読んで、私が探していたものを見つけました。私はまだ1つの質問を持っています:これらのイベントはJquery Ajaxコールにのみバインドされますか?または、JavaScript Ajax呼び出しにも使用できますか? – Joel

+0

@idealmachine、私は本当にFirefoxやJavaScriptライブラリを含むあらゆるソリューションを求めていました。 – Joel

0

ブラウザは、技術的に、これまで「ビジー」ではありません。

あなたのsetIntervalは、次のようになります。ビジネスは非常に主観的な言葉です。メインスレッドが実行をブロックする単純なwhileループを実行しているとします。ページが非常に不明瞭である「ビジー」であるかどうかので、

function busy() {setTimeout(busy, 0);do_something();} 
busy(); 

ブラウザは、(それ自体は)ブロックされていない:これは忙しいと考えられますが、あなたがこのような何かを持っている場合することができます。また、クロールのWebワーカーやコードに触れ始めることさえありません。

これを行うには、ハード押されたことになるだろう、とあなたが行う場合でも、それはおそらくあなたがそれをすることを期待どのように動作しません。それにもかかわらず、幸運。

+0

私は本当にネットワークビジーを意味します。私は、ブラウザがデータを送信しているか記録しているかを知る必要があります。私は明確にするために自分の投稿を更新します。ありがとう。 – Joel

関連する問題