web-dev-qa-db-ja.com

デスクトップブラウザーは、コンピューターがスリープ状態から再開したことを検出できますか?

コンピューターの「ウェイクアップ」イベントがブラウザーに伝搬され、JavaScript APIで使用できればいいのですが。このようなものが実装されているかどうか誰かが知っていますか?

59
Zak Linder

これを行う直接的な方法はわかりませんが、いつ発生するかを把握する1つの方法は、たとえば2秒ごとに実行され、最後に実行された時刻を保存するsetIntervalタスクを設定することです。次に、最後に実行された時間が2秒よりもかなり古いかどうかを確認します。

var lastTime = (new Date()).getTime();

setInterval(function() {
  var currentTime = (new Date()).getTime();
  if (currentTime > (lastTime + 2000*2)) {  // ignore small delays
    // Probably just woke up!
  }
  lastTime = currentTime;
}, 2000);
62
andrewmu

上記のメソッドで発生する可能性のある問題の1つは、警告ボックスまたは他のモーダルタイプのウィンドウがJSの実行を一時停止し、誤ったウェイクアップ表示を引き起こす可能性があることです。この問題を解決する1つの方法は、Webワーカーを使用することです(新しいブラウザーでサポートされています)。

var myWorker = new Worker("DetectWakeup.js");
myWorker.onmessage = function (ev) {
  if (ev && ev.data === 'wakeup') {
     // wakeup here
  }
}

// DetectWakeup.js (put in a separate file)
var lastTime = (new Date()).getTime();
var checkInterval = 10000;

setInterval(function () {
    var currentTime = (new Date()).getTime();

    if (currentTime > (lastTime + checkInterval * 2)) {  // ignore small delays
        postMessage("wakeup");
    }

    lastTime = currentTime;
}, checkInterval);
21
Lynn Neir

これは少し時代遅れですが、Andrew Muの回答に基づいて、それを行うための簡単なJQueryプラグインを作成しました: https://bitbucket.org/paul.okopny/jquery.wakeup-plugin/wiki/ホーム

使い方は簡単です:

$.wakeUp(function(sleep_time) {
    alert("I have slept for " + sleep_time/1000 + " seconds")
});

これが将来誰かを助けることを願っています。

3
Paul Okopny

他の人による非常に良い答えと説明は別として、onlineofflineイベントにも依存できます。 onlineが実際にオンラインであるかどうかはさておき、通常、このイベントは、ユーザーのマシンが実際のインターネット切断とは別にスリープ状態から戻ったときにもトリガーされます。

したがって、理想的な解決策は、タイマーチェックをオンラインイベントとオフラインイベントと組み合わせることです。

1
brightDot
var lastTime = (new Date()).getTime();

setInterval(function() {
  var currentTime = (new Date()).getTime();
  if (currentTime > (lastTime + 2000*2)) {  // ignore small delays
    setTimeout(function() {
     //enter code here, it will run after wake up
    }, 2000);
  }
  lastTime = currentTime;
}, 2000);
0
Serhii Lyzun