为什么Google Chrome会在片段更改时触发onload事件?

时间:2011-10-24 13:14:46

标签: google-chrome webkit v8

这让我感到疯狂,这是HTML代码。

<html>
    <head>
        <script>
        function init() {
            console.log("fire once");
            window.onhashchange = function() {
                console.log(location.hash);
            }
        }
        </script>
    </head>
    <body onload="init();">
        <a href="#t1">T1</a>
        <a href="#t2">T2</a>
    </body>
</html>

重现错误的步骤(我相信错误),打开控制台,单击T1,单击T2,单击返回,单击返回...在Firefox上这是控制台输出(我在[]中添加了鼠标操作。)

[load]
fire once
[click T1]
#t1
[click T2]
#t2
[click back]
#t1
[click back]
(an empty string)

在Google Chrome 14.0.835.202上(在Ubuntu和Windows XP上测试过),这是输出。

[load]
fire once
[click T1]
#t1
[click T2]
#t2
[click back]
fire once
#t1
#t2
#t1
[click back]
fire once
#t1
#t2
#t1
(an empty line)

Safari不会重现此错误,所以这可能是V8错误?谷歌Chrome是如何经历两年这个错误的?最重要的是我该如何预防?

谢谢大家。

1 个答案:

答案 0 :(得分:1)

不会再次触发onload事件。你看到点击T1和T2时的输出。当您通过单击#links或后退按钮导航同一页面时,Chrome不会刷新控制台。

编辑:好的,我可能误解了[]的含义。如果您在控制台中获得的 final 输出是

fire once
#t1
#t2
fire once
#t1
#t2
#t1
fire once
#t1
#t2
#t1
<empty>

然后这似乎已在我检查的最新Dev版本17中得到修复(尽管它也适用于我躺在的古老的Chromium 12)。我没有检查稳定的Chrome 15。

如果相反,你的意思是控制台中的最终输出只是其中的最后五行,那么原因就像我给出的答案一样。