防止onbeforeunload函数暂停Javascript计时器

4

在我的网页中,我使用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()函数。有什么想法可以防止这种情况发生吗?

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

4

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


2

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


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

1

不可以在UI线程被其他任务占用时(在此情况下,呈现本地模态对话框提示)仍然在后台更新UI。

请参阅Javascript timeout - specification


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接