Javascript 如果没有用户交互,Chrome popstate不会在后退按钮上启动

Javascript 如果没有用户交互,Chrome popstate不会在后退按钮上启动,javascript,popstate,Javascript,Popstate,我试图使用“pushState”和“popstate”事件来捕获返回按钮导航,但是,虽然popstate事件在Firefox中正确触发,但如果没有用户交互,它在Chrome(76.0.3809.87版(官方版本)(64位))中不会触发 从测试来看,似乎只有在用户与页面交互(即单击文档的某个地方)时才会触发popstate事件。因此,如果在没有交互的情况下加载页面并进行回击,则不会调用popstate函数 我添加了一把小提琴来展示这一点: 要在Chrome中测试小提琴,只需单击链接并点击后退按钮。

我试图使用“pushState”和“popstate”事件来捕获返回按钮导航,但是,虽然popstate事件在Firefox中正确触发,但如果没有用户交互,它在Chrome(76.0.3809.87版(官方版本)(64位))中不会触发

从测试来看,似乎只有在用户与页面交互(即单击文档的某个地方)时才会触发popstate事件。因此,如果在没有交互的情况下加载页面并进行回击,则不会调用popstate函数

我添加了一把小提琴来展示这一点:

要在Chrome中测试小提琴,只需单击链接并点击后退按钮。你不会看到警报。然后再次单击链接,但这次单击Fiddle文档上的任意位置,然后单击后退按钮,然后触发警报

我在Chromium论坛上发现了一个可能与这个怪癖有关的讨论,也许这是为了防止历史记录被滥用——以及

如果是这种情况,是否意味着不能再依赖popstate来捕获后退按钮操作?如果是,是否有解决方案

下面是我一直在测试的示例:

window.addEventListener('load', function() {
    history.pushState(null, null, document.URL);
});

window.addEventListener('popstate', function(event) {
    alert('test');
});

我希望无论用户交互如何,都会在后退按钮上触发警报,但这在Chrome中不会发生。

正如其他人在评论中建议的那样,这应该是通过浏览器软件的设计来实现的,以防止劫持其默认后退按钮行为。

尝试添加设置超时0

window.onpopstate = () => setTimeout(alert("Pop"), 0);
在编写处理popstate事件的函数时,重要的是要考虑诸如window.location之类的属性已经反映了状态更改(如果它影响了当前URL),但文档可能仍然不会。如果目标是捕捉新文档状态已完全就位的时刻,则应使用零延迟setTimeout()方法调用有效地将其内部回调函数放置在浏览器事件循环的末尾进行处理:window.onpopstate=()=>setTimeout(doSomeThing,0)

内容取自


另一方面,建议不要使用此选项,因为浏览器可能会随时删除此选项。

我最近一直在做一些popstate处理来恢复滚动位置,所以我的记忆中很新鲜,但我仍然不理解这个问题。也许如果你有一个逐步(或图表),你会得到更多feedback@Drenai谢谢你的反馈。我已经编辑了我的问题,试图使它更具体的问题在手。希望这能让它更清楚。我在下面的链接上读到了更多关于它的信息。Chrome似乎有意阻止默认后退按钮行为的劫持(这是有充分理由的)。如果你能找到解决办法,我怀疑它是否可靠,因为Chrome的未来版本可能会再次修补它@Drenai感谢这篇文章——这有助于确认这一变化。我确实看到了它的原因,尽管它确实意味着合法用例不再有效。我想我需要寻找其他方法来实现我所需要的(但可能要以用户体验为代价)。我很高兴遇到这个问题。就我的一生而言,我无法理解当我回击时重新加载页面时我做错了什么。果不其然,在回击之前,我点击了页面上的一些点,一切都如期进行。真奇怪。