【问题标题】:Prevent onbeforeunload function from pausing Javascript timer防止 onbeforeunload 函数暂停 Javascript 计时器
【发布时间】:2012-10-04 16:40:48
【问题描述】:

在我的网页中,我有一个使用 Javascript 的 setTimeout() 的倒数计时器。

    function Tick() {
        if (RemainingSeconds <= 0) {
            alert("Time is up.");
            return;
        }
        RemainingSeconds -= 1;
        ElapsedSeconds += 1;
        UpdateTimerDisplay();
        window.setTimeout("Tick()", 1000);
    }

我还在onbeforeunload 上触发了一个功能,以“防止”用户离开页面。

    window.onbeforeunload = function () {
        if (!isIEAjaxRequest) {
            return "You should use the logout button to leave this page!";
        }
        else {
            isIEAjaxRequest = false;
        }
    };

问题是当“你确定要离开这个页面吗?”窗口提示,它会暂停setTimeout() 函数。关于如何防止这种情况的任何想法?

【问题讨论】:

  • 与问题无关,应将代码写为window.setTimeout(Tick, 1000);。将函数名放在字符串中只会让引擎解析 JavaScript。
  • 我一直在考虑一种方法,您的 beforeunload 处理程序触发事件然后返回 false,因此取消卸载。然后事件的处理程序会弹出一个对话框,询问您是否要离开,如果您说是则卸载。我不确定的是您是否可以在最初触发卸载时找出用户想要做什么(关闭窗口,导航到另一个页面等)。 IWBNI 处理程序收到带有此信息的参数。
  • No Barmar,出于安全原因,这是不可能的。如果您可以阻止用户关闭网页,那么您可以确定所有那些烦人的弹出窗口都会使用它! ;)

标签: javascript settimeout dom-events onbeforeunload


【解决方案1】:

你不能。 Javascript 是严格的单线程,因此任何模式弹出窗口都会暂停其他所有内容。

【讨论】:

    【解决方案2】:

    一种可能的解决方法是使用var before = new Date() 存储对话框出现之前的时间,然后使用该时间来计算对话框消失后经过的时间以弥补错过的秒数。

    【讨论】:

    • 由于这个问题没有真正的解决方案,我会将您的解决方法标记为已接受。我相信这是减少任何影响的简单方法。
    【解决方案3】:

    不,当 UI 线程被另一个任务消耗时,您不能在后台继续更新 UI(在这种情况下,显示本机模式对话框提示)。

    Javascript timeout - specification

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多