任何桌面浏览器都可以检测到计算机何时从睡眠中恢复吗?

Posted

技术标签:

【中文标题】任何桌面浏览器都可以检测到计算机何时从睡眠中恢复吗?【英文标题】:Can any desktop browsers detect when the computer resumes from sleep? 【发布时间】:2011-05-04 00:11:34 【问题描述】:

如果计算机的“唤醒”事件能够传播到浏览器并在 javascript API 中可用,那就太好了。有谁知道有没有这样的实现?

【问题讨论】:

我对此表示怀疑,因为它可能必须弥合孤立的浏览器和操作系统之间的差距,但我有兴趣发现它实际上是可能的。 定义“睡眠”,因为这个术语因设备而异。 我已将问题编辑为专门针对桌面浏览器。我希望这个问题有点与设备无关,因为使用这种 API 的 webapp 可能会针对多个平台/设备。 @Nick 在我的特定用例中,webapp 会启动与服务器的持续连接。如果设备进入睡眠状态,此连接将被切断,应在唤醒时重新启动。似乎没有自动执行此操作的好方法(我不想强迫用户按下按钮:P)。 【参考方案1】:

我不知道有什么直接的方法可以做到这一点,但是您可以很好地了解它何时发生的一种方法是设置一个 setInterval 任务,该任务每隔 2 秒运行一次,并存储它的持续时间跑了。然后检查它最后一次运行的时间是否远远超过 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);

【讨论】:

这与我的处理方式相似——只是,使用比两秒大得多的间隔:-) 我想 5 分钟将是一个相当小的值(我的计算机很少进入睡眠状态任何一小段时间)。此外,另一种方法是记录发生了多少“滴答”与应该发生多少(保持平均值)。还有可能被边缘化的时间变化(DST——最好使用UTC——或用户)的边缘情况。 这很好,但是当你在睡眠后触发一个ajax请求时,它会失败!为什么?在调用 ajax 请求之前有警告声明会奏效!为什么? @moderns 这是因为网络连接可能还没有完全建立起来,但是警报会暂停脚本,直到用户点击它,这有足够的时间让事情开始运行。跨度> 一个好主意,但请记住 setInterval and setTimeout execution speed can be affected when the tab is in the background,这是设计使然。【参考方案2】:

这有点过时了,但根据 Andrew Mu 的回答,我创建了一个简单的 JQuery 插件来做到这一点: https://github.com/paulokopny/jquery.wakeup-plugin

用法很简单:

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

希望这对将来的某人有所帮助。

【讨论】:

【参考方案3】:

使用上述方法可能会遇到的问题之一是警告框或其他模式类型的窗口会暂停 JS 执行,这可能会导致错误的唤醒指示。解决此问题的一种方法是使用网络工作者(在较新的浏览器上支持)....

DetectWakeup.js(必须是自己的文件)

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

然后在您的应用程序中,像这样使用它:

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

【讨论】:

可以给个演示吗?我已经尝试解决它,但它没有给出任何东西。甚至不在控制台中。【参考方案4】:

除了别人很好的回答和解释外,你还可以依赖onlineoffline事件。撇开online 是否真的在线不谈,通常,当用户的机器从睡眠中恢复时,除了真正的互联网断开之外,这个事件也会被触发。

因此,理想的解决方案是将计时器检查与在线和离线事件相结合。

【讨论】:

有趣的建议...我非常希望它能够工作,但它不适合我(macOS 上的 Firefox 71 或 Safari 13,或 Windows 上的 Chrome 78)。这在什么情况下有效? 这在检测计算机是否进入睡眠或唤醒时不起作用,它专门寻找互联网连接关闭或打开 但它绝对按预期工作。查看文档:developer.mozilla.org/en-US/docs/Web/API/Document/ononline【参考方案5】:
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);

【讨论】:

setInterval 函数在系统休眠时运行,setTimeout 函数在系统休眠时也运行,但代码在系统唤醒时运行(事件循环)【参考方案6】:

另一种方式,使用会话时间

 setInterval(function() 
        let last = parseInt(localStorage.getItem('sessionTime'));
        let now =  (new Date()).getTime();

        const diffTime = Math.abs(now - last + 2000 * 2);
        if (diffTime > 480000) 
          _this.authService.logout(1);
        
       , 3000);

【讨论】:

以上是关于任何桌面浏览器都可以检测到计算机何时从睡眠中恢复吗?的主要内容,如果未能解决你的问题,请参考以下文章

使计算机进入睡眠状态是啥意思

我如何知道Windows何时进入/退出睡眠模式或休眠模式?

检测何时使用 JavaScript 调整窗口大小?

电脑在睡眠状态下能远程吗?能否在远程进行登入唤醒。。

检测 iPhone 中断的类型

跟踪用户点击浏览器上的后退按钮的时间