浏览器挂起/挂起检测

Browser suspend / hang detection

本文关键字:挂起 检测 浏览器      更新时间:2023-09-26

是否有办法检测浏览器被挂起/冻结/挂起(例如:通过操作系统锁屏)?

我有一个问题与ajax计时器机制。按钮上的单击向启动时钟的控制器发送ajax请求。在浏览器打开的同时,另一个脚本(通过"setInterval")使时钟运行。当按钮再次被点击时,ajax请求停止计时器并杀死setInterval。

然而,我需要检测,浏览器被冻结(javascript停止),如果是这样,使一个ajax请求更新定时器。

我想知道如果它实际上是可能的javascript和现代浏览器。是吗?

编辑:我想我第一次没有解释清楚。无限循环是必须的。这些元素是计时器(秒表)。我不想检测脚本是否因为js错误或浏览器过载而冻结。

我想检测浏览器(js)是否因为操作系统锁屏,操作系统睡眠或其他原因而停止。

不保证跨浏览器兼容性或任何类型的标准遵从;这有点粗俗,要看具体情况,真的。

(function() {
    // milliseconds
    var lastTime = (new Date).getTime()
    ,   acceptableDelta = 500
    ,   tick = 1000
    ,   hung = false;
    function hangman() {
        var now = (new Date).getTime();
        if(now - lastTime > (tick + acceptableDelta)) {
            hung = true;
        } else if(hung) {
            hung = false;
            console.warn('Possible browser hangup detected.');
        }
        lastTime = now;
    }
    setInterval(hangman, tick);
}());

这背后的概念是,如果浏览器能够为用户停止失控脚本,但保留页面的其余部分,计时器将检测到这种差异,并在控制台中警告用户。

jsFiddle的演示在这里,公平的警告,不要点击按钮,除非你真的想开始一个无限循环。


最后,您可能需要重新考虑为什么要这样做,并在设计层面上与任何可能导致浏览器挂起的来源作斗争。避免没有暂停、无限循环、处理器密集型操作等的繁重和顺序工作负载。使用异步回调分隔任务,并在代码中放置策略延迟,以给浏览器和用户计算机一些喘息的空间。

不可能。唯一与此相近的方法是侦听窗口关闭,并在代码的最后一刻执行一些代码。

window.onbeforeunload = function(event) {
    //do something, ask if the user really wants to exit the page, cancel ajax or whatever it is you need to achieve.
}

Ajax请求是用javascript代码完成的。如果任何javascript导致浏览器挂起/冻结,这意味着可能存在不允许移动到特定javascript代码之前的错误。一旦它冻结了浏览器,浏览器就会尝试检测错误(而不是脚本,因为脚本本身被冻结了)。它在软件中(浏览器软件,无论是IE/FF/chrome)。

最好是将javascript代码封装在

try
{
}
catch
{
}

捕获错误。