【问题标题】:Why does Google Chrome fire onload event on fragment change?为什么谷歌浏览器会在片段更改时触发 onload 事件?
【发布时间】:2011-10-24 13:14:45
【问题描述】:

这让我发疯了,这是 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 错误?谷歌浏览器到底是怎么度过这个错误的两年的?最重要的是如何预防?

谢谢大家。

【问题讨论】:

    标签: google-chrome webkit v8


    【解决方案1】:

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

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

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

    然后这似乎已在我检查的最新 Dev 版本 17 中得到修复(尽管它在我周围的古老 Chromium 12 上也能正常工作)。我还没有检查稳定的 Chrome 15。

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

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 1970-01-01
      • 2020-11-06
      • 2012-04-21
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      相关资源
      最近更新 更多