1

在 chrome 和 firefox/IE 中试试这个:

    var cancelPressed = false;
    function redirect()  {
        //window.location = "http://www.google.com";
        alert('hi!');
    }

    window.onbeforeunload = function() {
        window.pressedTimer = setInterval("cancelPressed = true; clearInterval(window.pressedTimer);",3000);
        window.onbeforeunload = function() {
            if (!cancelPressed) {
                window.unloadTimer = setTimeout('redirect()',500);
                window.onbeforeunload = function() {clearTimeout(window.unloadTimer);};
                return "Redirecting..";
            } else {
                return 'wups';
            }
        };
        return 'first!';
    };

在 FF/IE 中,刷新,在第一个提示上点击取消,等待大约六秒钟,然后尝试刷新。'wups' 将被触发。但是,在 Chrome 中,您可以随意等待,并且 cancelPressed 永远不会设置为 true。

你怎么看?

4

1 回答 1

1

您使用的是哪个版本的 Chrome?如果我等待的时间足够长,我也会'wups'在 Chrome 中收到消息。但是,我注意到 Webkit 浏览器和其他浏览器之间的细微差别。考虑以下代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <title>Javascript test</title>
        <script type="text/javascript" language="javascript">
            window.onload = function() {
                document.getElementById("test").onclick = function() {
                    var startdate;

                    var interval = window.setInterval(function() {
                        // Get the difference (in milliseconds) between the current 
                        // date and the startdate.  
                        var diff = (new Date()).getTime() - startdate.getTime();
                        alert(diff);

                        window.clearInterval(interval);
                    }, 5000);

                    alert("Hello!");
                    startdate = new Date();
                };
            };
        </script>
    </head>
    <body>
        <button id="test">Test button</button>
    </body>
</html>

在 chrome 和 safari 中,第二个警报总是会显示一个略大于 5000 的数字,而在其他浏览器中,您会得到一个介于 0 和 5000 之间的数字。

那么发生了什么?使用setInterval(),浏览器会创建一个计时器,该计时器将在每个给定的时间间隔调用一个 javascript 方法。Javascript 是单线程的,警告框会完全阻止 javascript 的执行。在 chrome 和 safari 中,这意味着计时器也被暂停,而在其他浏览器中计时器继续,但 javascript 方法调用被抑制,直到警报框关闭。

这和你的例子有什么关系?这意味着在 chrome 和 webkit 中,您始终必须等待至少 3000 毫秒才能cancelPressed设置,而在其他浏览器中,这将发生在 0 到 3000 毫秒之间。

于 2011-03-03T03:29:41.830 回答