Chrome为什么/如何以不同于其他浏览器的方式处理onbeforeunload?

时间:2011-03-03 02:28:38

标签: javascript google-chrome onbeforeunload

在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。

您怎么看?

1 个答案:

答案 0 :(得分:1)

您使用的是哪个版本的Chrome?如果我等待足够长时间,我还会在Chrome中收到'wups'消息。但是,我注意到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毫秒之间。