JavaScript通过History API实现无刷新路由控制,核心是pushState添加、replaceState替换历史条目,并通过popstate事件响应导航,需手动更新视图。

JavaScript 通过 History API 提供了对浏览器会话历史的编程控制能力,可以实现无刷新跳转、自定义前进/后退行为,以及维护单页应用(SPA)的路由状态。核心不是操作整个历史栈,而是安全地读写当前会话中的历史条目。
使用 history.pushState() 添加新历史记录
该方法在不刷新页面的前提下,向历史栈中插入一条新记录,并更新地址栏 URL(需同源):
- 语法:
history.pushState(state, title, url) - state:任意可序列化的对象,将随该历史项一起保存,后续 popstate 事件中可读取
-
title:目前大多数浏览器忽略此参数,传空字符串
''即可 - url:相对路径或绝对路径(必须同源),仅影响地址栏显示和 history.state,不触发资源加载
示例:history.pushState({ page: 'detail', id: 123 }, '', '/product/123');
执行后,地址栏变为 /product/123,但页面不刷新;点击浏览器后退按钮会回到上一状态。
使用 history.replaceState() 替换当前历史记录
与 pushState 类似,但不新增记录,而是**替换当前历史项**,常用于更新 URL 但不想增加返回层级:
- 语法:
history.replaceState(state, title, url) - 适用场景:表单提交后修正 URL、过滤参数变更、修复初始 URL 等
示例:history.replaceState({ search: 'js' }, '', '?q=js');
此时地址栏更新为 ?q=js,但历史栈长度不变,后退不会回到旧查询参数页。
监听 popstate 事件响应前进/后退
当用户点击浏览器前进/后退按钮,或调用 history.back()/history.forward() 时,会触发 popstate 事件:
立即学习“Java免费学习笔记(深入)”;
- 事件对象的
event.state包含对应历史项的 state 数据 - 需手动根据 state 渲染视图或恢复状态(History API 不自动做任何 DOM 更新)
- 注意:页面首次加载时不会触发 popstate,需单独处理初始 state
示例:
window.addEventListener('popstate', (e) => {
if (e.state?.page === 'detail') {
loadProduct(e.state.id);
}
});
手动控制前进后退(谨慎使用)
可通过以下方法模拟用户导航操作:
-
history.back():等价于点击后退按钮 -
history.forward():等价于点击前进按钮 -
history.go(n):n 为整数,正数前进 |n| 步,负数后退 |n| 步;go(0)刷新当前页(不推荐,应使用location.reload())
⚠️ 注意:这些方法受浏览器限制,比如跨域 iframe 中可能被禁止;且无法绕过安全策略跳转到非同源页面。











