我最近偶然发现了OSX上Chrome的奇怪行为。加载特定页面时,我会将新页面推送到窗口历史记录中,以便如果用户单击“后退”按钮,则将加载新页面,而不是原来的页面。
我正在使用replaceState
和pushState
来修改历史记录,并在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。
答案 0 :(得分:2)
Chrome 75 启动了历史记录操作干预。
Here是公告/更多详细信息。
干预摘要:
某些页面使用户难以或无法返回到 他们通过浏览器的“后退”按钮来自的页面。这是 通过重定向或操纵浏览器历史记录来完成 导致滥用/烦人的用户体验。这种干预 使浏览器的后退按钮保持一致并防止滥用。新的 浏览器的“后退”按钮的行为将是跳过 添加历史记录条目或重定向用户而从未获得 用户手势。请注意,干预只会影响浏览器 后退/前进按钮UI,而不是history.back / forward API。
在此特定示例中,按下时,用户将被带到他们访问的最后一页(第1页),而不是新页面。这符合用户对浏览器后退按钮的期望。