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

JavaScript 通过 History API 提供了对浏览器会话历史的编程控制能力,可以实现无刷新跳转、自定义前进/后退行为,以及维护单页应用(SPA)的路由状态。核心不是操作整个历史栈,而是安全地读写当前会话中的历史条目。
该方法在不刷新页面的前提下,向历史栈中插入一条新记录,并更新地址栏 URL(需同源):
history.pushState(state, title, url)
'' 即可示例:history.pushState({ page: 'detail', id: 123 }, '', '/product/123');
执行后,地址栏变为 /product/123,但页面不刷新;点击浏览器后退按钮会回到上一状态。
与 pushState 类似,但不新增记录,而是**替换当前历史项**,常用于更新 URL 但不想增加返回层级:
history.replaceState(state, title, url)
示例:history.replaceState({ search: 'js' }, '', '?q=js');
此时地址栏更新为 ?q=js,但历史栈长度不变,后退不会回到旧查询参数页。
当用户点击浏览器前进/后退按钮,或调用 history.back()/history.forward() 时,会触发 popstate 事件:
event.state 包含对应历史项的 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 中可能被禁止;且无法绕过安全策略跳转到非同源页面。