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 では、更新し、最初のプロンプトでキャンセルを押し、約 6 秒待ってから更新を試みます。「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 では、2 番目のアラートは常に 5000 よりわずかに大きい数値を表示しますが、他のブラウザーでは 0 から 5000 の間の数値が表示されます。

それで、何が起こっているのですか?を使用setInterval()すると、ブラウザは特定の間隔ごとに JavaScript メソッドを呼び出すタイマーを作成します。Javascript はシングル スレッドであり、警告ボックスは JavaScript の実行を完全にブロックします。Chrome と Safari では、これはタイマーも一時停止することを意味しますが、他のブラウザーではタイマーは継続しますが、アラート ボックスが閉じられるまで JavaScript メソッドの呼び出しは抑制されます。

これはあなたの例と何の関係がありますか? これは、chrome と webkit では、設定する前に少なくとも 3000 ミリ秒待たなければならないことを意味しますがcancelPressed、他のブラウザーでは、これは 0 から 3000 ミリ秒の間のどこかで発生します。

于 2011-03-03T03:29:41.830 に答える