Google chrome 为什么Google Chrome在片段上触发onload事件会发生变化?

Google chrome 为什么Google Chrome在片段上触发onload事件会发生变化?,google-chrome,webkit,v8,Google Chrome,Webkit,V8,这让我发疯,这是HTML代码 <html> <head> <script> function init() { console.log("fire once"); window.onhashchange = function() { console.log(location.hash); } }

这让我发疯,这是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>
在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不会复制这个bug,所以这可能是V8 bug?Google Chrome两年来是如何处理这个bug的?最重要的是,我如何预防它


谢谢大家。

不会再次触发onload事件。您将看到单击T1和T2时的输出。当您通过单击链接或后退按钮浏览同一页面时,Chrome不会刷新控制台

编辑:好吧,我可能误解了你所说的[]的意思。如果您在控制台中得到的最终输出是

fire once
#t1
#t2
fire once
#t1
#t2
#t1
fire once
#t1
#t2
#t1
<empty>
开火一次
#t1
#t2
开火一次
#t1
#t2
#t1
开火一次
#t1
#t2
#t1
然后,这似乎已经在我检查过的最新开发版本17中得到了修复(尽管它在我躺着的一个古老的Chromium 12上也可以正常工作)。我还没有检查稳定的Chrome 15

相反,如果您的意思是控制台中的最终输出只是最后五行,那么原因正如我在回答中所给出的

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