You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome 122版本window.popstate事件多次点后退/前进不触发问题

Chrome 122中多次点击后退/前进时popstate事件不触发的问题及解决方法

问题原因

Chrome 122版本对浏览器历史导航逻辑做了优化:当用户快速连续点击后退/前进按钮时,浏览器会合并多次历史操作,直接跳转到最终目标页面,跳过中间的popstate事件触发。这直接导致你之前依赖popstate事件触发时调用pushState维持历史栈、阻止导航的逻辑失效。

原代码失效的核心原因

你的原代码通过在popstate事件回调里再次调用pushState补充历史栈,以此抵消后退/前进操作。但Chrome 122的优化使得连续点击场景下popstate事件根本不会触发,补栈逻辑无法执行,浏览器直接完成导航。

解决方案

可以通过以下方式调整代码,适配Chrome 122的新行为:

方案1:用replaceState维持历史状态

// 页面加载时初始化历史状态,避免初始后退操作生效
window.history.replaceState({ preventNav: true }, null, window.location.href);

window.addEventListener('popstate', function(e) {
  // 校验状态,确认需要阻止导航
  if (e.state?.preventNav) {
    // 替换回当前页面的历史状态,覆盖后退/前进操作
    window.history.replaceState({ preventNav: true }, null, window.location.href);
  }
});

这种方式用replaceState替代pushState,避免历史栈无限增长,同时在popstate触发时强制重置历史状态,阻止页面导航。

方案2:结合beforeunload事件(注意用户体验)

如果需要更严格的拦截(包括用户直接关闭标签页),可以添加beforeunload事件,但会触发浏览器默认的离开确认提示:

window.addEventListener('beforeunload', function(e) {
  e.preventDefault();
  e.returnValue = '';
});

注意:这种方式会打断用户的自然操作流程,仅建议在特殊业务场景下使用。

注意事项

强行阻止浏览器的后退/前进行为不符合常规网页交互逻辑,容易让用户产生困惑,建议仅在必要场景下使用。后续Chrome版本可能继续调整历史导航行为,需持续关注API变化。

内容的提问来源于stack exchange,提问作者Mohd Anzal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:12:09