web-dev-qa-db-fra.com

Est-ce que les navigateurs de bureau peuvent détecter quand l'ordinateur sort du mode veille?

Ce serait bien si l'événement de «réveil» de l'ordinateur était propagé au navigateur et disponible dans l'API JavaScript. Est-ce que quelqu'un sait si quelque chose comme ça est implémenté?

46
Zak Linder

Je ne connais pas de méthode directe pour ce faire, mais une façon de bien comprendre ce qui se passe est de configurer une tâche setInterval qui s'exécute, par exemple toutes les 2 secondes, et qui enregistre la dernière heure d'exécution. Ensuite, vérifiez si la dernière fois qu'il a été exécuté est beaucoup plus vieux que 2 secondes.

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);
57
andrewmu

L'un des problèmes que vous pouvez rencontrer avec les méthodes ci-dessus est que les boîtes d'alerte ou d'autres fenêtres de type modal suspendent l'exécution de JS, ce qui peut entraîner une fausse indication de réveil. Un moyen de résoudre ce problème consiste à utiliser des travailleurs Web (pris en charge par les nouveaux navigateurs) ....

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);
19
Lynn Neir

C'est un peu démodé, mais d'après la réponse d'Andrew Mu, j'ai créé un simple plugin JQuery pour le faire: https://bitbucket.org/paul.okopny/jquery.wakeup-plugin/wiki/Accueil

L'utilisation est simple:

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

J'espère que cela aidera quelqu'un à l'avenir.

3
Paul Okopny
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

Outre de très bonnes réponses et explications de la part d’autres personnes, vous pouvez également compter sur les événements online, offline. Gardant de côté si online est vraiment en ligne ou non, généralement, cet événement est ÉGALEMENT déclenché lorsque la machine de l'utilisateur repasse en veille, à part qu'il y a une véritable déconnexion Internet. 

La solution idéale consisterait donc à combiner la vérification du chronomètre avec les événements en ligne et hors ligne.

0
EggLikeStone