| « 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);