浏览器暂停/挂起检测

时间:2013-01-07 09:05:22

标签: javascript jquery html5

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

我遇到了ajax计时器机制的问题。单击按钮将ajax请求发送到启动时钟的控制器。在此期间浏览器打开,另一个脚本(通过“setInterval”)使时钟运行。再次单击该按钮时,ajax请求将停止计时器并且setInterval将被终止。

但是,我需要检测,浏览器被冻结(javascript停止),如果是,请发出ajax请求来更新计时器。

我想知道它是否真的可以通过javascript和现代浏览器实现。是吗?

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

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

3 个答案:

答案 0 :(得分:2)

不保证跨浏览器兼容性或任何标准合规性;它有点hackish,取决于环境,真的。

(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 here上的演示,公平警告,不要点击按钮,除非您真的想要开始无限​​循环。


最后,您可能想要重新考虑为什么要首先执行此操作,并在设计级别针对潜在的浏览器挂起进行任何来源。避免繁重和顺序的工作负载,无需暂停,无限循环,处理器密集型操作等。通过异步回调将您的任务分开,并在您的代码中设置策略性延迟,以允许浏览器和用户的计算机喘息。

答案 1 :(得分:1)

不可能。远程接近的唯一方法就是监听窗口关闭并执行代码中最后一段代码的消息。

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.
}

答案 2 :(得分:0)

使用javascript代码完成Ajax请求。如果任何javascript导致浏览器挂起/冻结,则意味着可能存在不允许超出该特定javascript代码的错误。一旦它冻结了浏览器,BROWSER就会尝试检测错误(而不是脚本,因为脚本本身已经冻结)。它在软件中(浏览器软件是IE / FF / chrome)。

最好将你的javascript代码包装在

try
{
}
catch
{
}

捕获错误。