JS 拦截任何跳转

创建于 3/5/2026

通过 Navigation API,捕获并拦截绝大多数跳转

写油猴脚本,希望拦截跳转。尝试重写 location.href 的 setter 未果,问 LLM,得知了 navigate 事件。一查,我去,太牛逼了。

首先,该事件是 Navigation APIMDN)的一部分,本身是为了实现 SPA 导航用的。这个 API 非常新,2026 年才刚刚全面支持,Chrome 系的支持得早一点。甚至 TypeScript 都不支持,还得自己装上第三方的类型定义。不过写点自己用的脚本问题不大。

上代码:

js
navigation.addEventListener('navigate', e => {
    console.log(e)
    e.preventDefault()
})

你没有看错!短短几行,就能实现:

  • 拦截 location 下一切跳转!包括直接设置属性(例如 location.href = url)、调用方法(例如 location.reload())。
  • 如果是本页面打开(_self),则可以拦截 window.open,以及 <a> 之类的操作。没错,用户操作也能拦截!毕竟是用来实现导航的。
  • history.pushState()replaceState(),本身没有跳转功能,但也可拦截。
  • history.back()(还有 forwardgo)以及用户在浏览器点击的前进、后退按钮,大部分情况下可以捕获但无法拦截。

欲知更多可以拦截的类型,以及其他相关 API,就去看文档吧!