【问题标题】:Browser suspend / hang detection浏览器挂起/挂起检测
【发布时间】:2012-12-20 23:51:14
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 浏览器页面挂起的问题是它通常是 JavaScript 无限循环或类似的东西导致挂起。发生这种情况时您无法运行 JS,因为它会等待挂起的 JS 完成。
  • 我认为如果你不让浏览器无限循环冻结会更好。
  • 如果浏览器被冻结,你将如何发出 ajax 请求?
  • 你真的认为当浏览器被冻结时,它的一个小角落可以让你运行代码吗?听起来像是一辆没油的汽车,但你想多开一点
  • Juhana:你没看懂,或者我描述得不好。我不想在浏览器处于睡眠状态时拨打电话。我想检测一下,那个浏览器已经睡着了,然后打电话(当它恢复工作时)。

标签: javascript jquery html


【解决方案1】:

不保证跨浏览器兼容性或任何形式的标准合规性;这有点老套,真的要视情况而定。

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


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

【讨论】:

    【解决方案2】:

    不可能。唯一接近的就是监听窗口关闭并在你的代码中执行最后一点代码。

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

    【讨论】:

      【解决方案3】:

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

      最好的办法是将你的javascript代码包装在

      try
      {
      }
      catch
      {
      }
      

      捕获错误。

      【讨论】:

        猜你喜欢
        • 2013-02-28
        • 1970-01-01
        • 2019-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-12
        • 2019-09-19
        • 1970-01-01
        相关资源
        最近更新 更多