4

有什么方法可以检测到浏览器被挂起/冻结/挂起(例如:通过操作系统锁定屏幕)?

我对 ajax 计时器机制有疑问。单击按钮向启动时钟的控制器发送 ajax 请求。在浏览器打开的同时,另一个脚本(通过“setInterval”)使时钟运行。再次单击该按钮时,ajax 请求将停止计时器并终止 setInterval。

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

我想知道javascript和现代浏览器是否真的可以做到。是吗?

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

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

4

3 回答 3

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上的演示,公平警告,除非您确实想要开始无限​​循环,否则不要单击按钮。


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

于 2013-01-07T09:41:42.493 回答
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.
}
于 2013-01-07T09:25:22.513 回答
0

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

最好的方法是将您的javascript代码包装在

try
{
}
catch
{
}

捕获错误。

于 2013-01-07T09:24:56.070 回答