最可靠方式是用 performance.getentriesbytype('navigation')[0].navigationtype 获取字符串类型,值为'reload'、'back_forward'、'navigate'或'prerender';再结合 unloadeventstart、redirectcount 和 fetchstart 与 navigationstart 的差值综合判断导航行为。

直接用 performance.getEntriesByType('navigation')[0] 获取当前导航条目,再读取其 navigationType 字符串属性,是最可靠、最现代的方式。旧的 performance.navigation.type 已在 Chrome 91+ 彻底失效,不能依赖。
看 navigationType 字段值
PerformanceNavigationTiming 对象(即 navigation 条目)自带 navigationType 属性,返回明确的字符串,无需查表或 switch 数字:
- 'reload':用户主动刷新(F5、Ctrl+R、Cmd+R、地址栏回车等)
-
'back_forward':通过浏览器前进/后退按钮或 history API(如
history.back())触发 -
'navigate':正常跳转(点击链接、
window.location赋值、表单提交等) - 'prerender':页面被预渲染(较少见,需主动启用)
结合 unloadEventStart 判断是否真发生了“卸载”
刷新和新跳转都会触发前页卸载,而回退通常复用缓存、不卸载——这是关键区分点:
- 若
entry.unloadEventStart > 0且entry.unloadEventEnd > 0:说明前一个页面确实执行了 unload 流程 → 属于 刷新或 navigate - 若
entry.unloadEventStart === 0:大概率是 back_forward(浏览器跳过卸载,直接恢复页面) - 注意:Safari 对 unload 事件的支持较弱,该字段可能恒为 0,需配合
navigationType主判断
观察 redirectCount 和重定向时间戳
刷新和新跳转可能携带重定向链,而回退几乎不会:
-
entry.redirectCount > 0:存在重定向 → 排除 back_forward,属于 reload 或 navigate - 检查
entry.redirectStart和entry.redirectEnd是否都 > 0:确认重定向真实发生,而非字段默认值 - 若 redirectCount === 0 且 unloadEventStart === 0 → 高概率是 back_forward
比对 fetchStart 与 navigationStart 的关系
这个差值能反映资源加载策略差异:
-
reload:通常
fetchStart ≈ navigationStart(从零发起请求) -
navigate:同上,但若目标 URL 有强缓存,
fetchStart可能略晚于navigationStart(等待缓存读取) -
back_forward:常出现
fetchStart (浏览器提前预加载或从内存缓存恢复,navigationStart 反而晚于 fetch 开始) - 实际中建议用
entry.fetchStart - entry.navigationStart的符号和绝对值辅助验证










