2009-07-29 3 views
4

ブラウザのJavascriptエンジンが一定時間アイドル状態になっている場合にtrueを返すJavacript関数をどのように書くことができますか?Javascriptのアイドル状態を検出するにはどうすればよいですか?

mootools/jQueryなどを使用していただければ幸いですが、mootoolsを少し優先して使用してください。

EDIT:

私の実際の問題:私はサードパーティのAPIへの呼び出しを作ってるんです。呼び出しはすぐに戻りますが、実際にDOMに対して行う作業はしばらく(多くの場合10秒を超えて)続きます。 DOMの作業が完了するとすぐに私のコードを実行します。私が呼び出すAPI関数の内部については何も知らないので、関数が終了したかどうかを判断する一般的な方法を探していました。

答えて

3

このような関数を呼び出すと、アイドル時間カウンタがリセットされることはありません。

あなたが解決しようとしている問題の概要を説明できれば、私たちはあなたに手を差し伸べることができるかもしれません。私は、「この機能が実行されてからどれくらいの期間が経過したか」、または「ページ上の最後のイベントからどれくらいの期間が経過したか」、または「ユーザーがこのページにX私は何も起こっていないときにのみこれをやるための良い方法はありません。あなたの更新に基づいて

更新

、私はAPIのコールバックメカニズムを探したい(あなたはそれが何であるかを共有できる?)APIが完了した後、あなたがのためにいくつかの仕事のスケジュールを設定できるようになること。問題が解決しない場合は、のようなものを追加してみてください:

setTimeout(function() { myCallbackMethod(); }, 0); 

これは、現在の実行が完了すると起動するコールバックをスケジュールします。それは、シングルスレッドされているJavaScriptエンジンに依存しますが、私はそれが良い効果に慣れているのを見ました。

+0

私は私の質問に追加しました。 – jjujuma

0

javascript/flashスレッドのアイドル状態を測定するために悪用できることは2つあります。ジャバスクリプトがアイドル状態のときのみダニ

  1. Javascriptのタイミングたソース(setTimeout, setInterval)。したがってスレッドのアイドル時間が短いほど、タイマーは遅くなります。

    『他の非同期イベントの 進行を阻止する「JavaScriptがしかコードのこれら ブロックの各々は、(原因その シングルスレッドの性質のために)時のコードのいずれか 部分を実行することができる』。 これは、非同期の イベントが発生したとき(マウスクリック、 タイマーの起動、またはXMLHttpRequest が完了したときなど)、後で実行される にキューイングされることを意味します。

    How JavaScript Timers Work
  2. Javascriptが関係なくアイドルのマダニ外部タイミングソースを有しています。クラスインスタンスDate()は外部クロックに基づいており、getTime()を使用してミリ秒のタイミングを得ることができます。

    var timeSinceDisco =(新しい日付).getTime();

eJohnはいくつかの興味深いテストを持っていますusing getTime() for benchmarking

外部タイマーDate.getTime()と内部時刻setTimeoutの差を使って、JavaScriptスレッドのアイドル状態を計算します。もちろん、V8tracemonkeyのようなセクシーな新しいjavascriptエンジンでは、複数のスレッドを使用するため、これはうまく機能しません。現在そこにあるほとんどのブラウザでうまくいくはずです。

Lessons from Gmail: Using Timers Effectively

+1

役立つことができると思いますが、これは実装依存ではありませんか? – Cide

+1

私はCideに同意するが、そうでなければ巧妙なアプローチ – jlarson

+0

@Cide私の経験では、setTimeoutはマルチスレッドのjsエンジン以外のすべてで同じように動作する。私はそれはブラウザ間でいくつかのかなりトリッキーな別の動作がある可能性がありますが同意する。 –

0

私はそのような機能はありません99.4%確信しています、しかし、私は本当にそれを必要とするので、そこにいたことを望みます。

もちろん、ここで独自のソリューション(すべてのエントリポイント関数の初めに呼び出す関数)を構築することもできますが、詳細によってはオーバーヘッドが低い可能性があります。

var Tracker={ 
last: new Date().geTime(), 
activity:function() { this.last=new Date().geTime(); }, 
idle:function() { return new Date().geTime()-this.last; } 
} 


... 

var clickedSomething=function() { 
Tracker.activity(); 
...real code.. 
} 
0

マウスのXとYの位置を確認する機能を呼び出すことができます。それぞれのタイマー間隔を最後に保存したXとY位置と比較して、同じ場合はアイドル状態にします。

MooTools Sample

+0

@Kipと同じコメント:これは「ユーザーのアイドルですか?」です。 "javascriptエンジンがアイドル状態になっていませんか?" – tvanfosson