Chrome不会触发onpopstate处理程序,除非在单击返回按钮之前发生鼠标单击

时间:2019-07-05 19:14:45

标签: google-chrome dom-events

我最近偶然发现了OSX上Chrome的奇怪行为。加载特定页面时,我会将新页面推送到窗口历史记录中,以便如果用户单击“后退”按钮,则将加载新页面,而不是原来的页面。

我正在使用replaceStatepushState来修改历史记录,并在onpopstate处理程序上进行设置,以在单击后退按钮时加载新页面。

但是,在Chrome中,如果用户在单击后退按钮之前单击页面上的任意位置(或按任意键),则 除外。

我似乎无法在小提琴上演示它,但是如果您设置以下内容,您应该能够重现该行为

page1.html

<html>
<body>
<h1>This is page 1</h1>
<a href="page3.html">Go to page 3</a>
</body>
</html>

page2.html

<html>
<body>
<h1>This is page 2</h1>
<p>Well, how did you get here?</p>
</body>
</html>

page3.html

<html>
<body>
<h1>This is page 3</h1>
<p>Why don't you go back to page 1?</p>
<script>
history.replaceState(null, '', 'page2.html');
history.pushState(null, '', 'page3.html');
window.onpopstate = function(event) {
  console.log("Reloading page in onpopstate handler");
  window.location = document.location
}
console.log("Push page2.html to history");
</script>
</body>
</html>

然后在同一目录(例如python -m SimpleHTTPServer 8000)中启动简单的网络服务器,然后在Chrome中打开localhost:8000/page1.html

我希望您应该能够单击第3页的链接,然后立即单击“后退”按钮并最终显示在第2页。但是,您没有,最终返回第1页。

但是,如果您单击指向第3页的链接,然后单击页面上的任何位置,然后单击“后退”按钮,则将按预期方式进入第2页。在单击“后退”按钮之前按任意键也可以。

在Firefox和Safari中,您总是总是按预期结束在第2页上。

我正在运行OSX 10.14.5和Chrome 75.0.3770.100。

1 个答案:

答案 0 :(得分:2)

Chrome 75 启动了历史记录操作干预。

Here是公告/更多详细信息。

干预摘要:

  

某些页面使用户难以或无法返回到   他们通过浏览器的“后退”按钮来自的页面。这是   通过重定向或操纵浏览器历史记录来完成   导致滥用/烦人的用户体验。这种干预   使浏览器的后退按钮保持一致并防止滥用。新的   浏览器的“后退”按钮的行为将是跳过   添加历史记录条目或重定向用户而从未获得   用户手势。请注意,干预只会影响浏览器   后退/前进按钮UI,而不是history.back / forward API。

在此特定示例中,按下时,用户将被带到他们访问的最后一页(第1页),而不是新页面。这符合用户对浏览器后退按钮的期望。