« xul:datepicker と xul:timepicker | Bug 373518 – event.relatedTarget is never set when leaving popup » |
ユーザのアイドル時間を測定する nsIIdleService
Firefox 3 (Minefield) 以降限定だが、 nsIIdleService を使ってユーザのアイドル時間を測定したり、ユーザが一定時間何も操作しなかったことを検知したり、さらにその状態から操作を開始したことを検知することができる。言わずもがな、メッセンジャーのようなアプリケーションでユーザが退席中かオンラインかを見分ける用途などに最適だ。
まずXPCOMサービスを取得する。
gIdleService = Components.classes["@mozilla.org/widget/idleservice;1"] .getService(Components.interfaces.nsIIdleService);
現在のアイドル時間を取得するなら、 idleTime プロパティを調べるだけ。単位はミリ秒である。
setInterval(function() { document.getElementById("idleTime").value = Math.round(gIdleService.idleTime / 1000) + " 秒"; }, 1000);
ユーザが○○分間何もしなかった(マウスを動かしたりキーボードに触れたりしなかった)ことを検知して何らかの処理を実行するためには、 nsIObserver インタフェースを実装したオブザーバを作る。 observe メソッドへ渡される引数は…
aSubject | nsIIdleService 自身 |
aTopic | 指定時間が経過してアイドル状態に突入した場合は「idle」 アイドル状態から通常状態へと戻った場合は「back」 |
aData | 現在のアイドル時間 |
gIdleObserver = { observe: function(aSubject, aTopic, aData) { var status; switch (aTopic) { case "idle": status = " 退席中..."; break; case "back": status = " 戻りました"; break; } document.getElementById("log").value += new Date().toLocaleTimeString() + status + " "; } };
オブザーバを addIdleObserver メソッドで登録する。第2引数はアイドル状態になるまでの時間(単位は分)である。
gIdleService.addIdleObserver(gIdleObserver, 1);
上記サンプルでは、1分間(厳密には+5秒のディレイあり)何も操作しないと「退席中…」が表示され、その後何か操作をすると「戻りました」が表示される。
用が済んだら removeIdleObserver でオブザーバを解除するのをお忘れなく。
gIdleService.removeIdleObserver(gIdleObserver, 1);