history对象属BOM,提供back()、forward()、go()导航及pushState()、replaceState()、popstate事件管理状态;单纯调用back()/go()不保存或恢复状态,需手动配合API实现。

JavaScript 中的 history 对象属于 BOM(浏览器对象模型),用于操作浏览器会话历史记录。它不直接暴露当前 URL 列表,但提供了 back()、forward()、go() 方法来导航,以及 pushState()、replaceState() 和 popstate 事件来管理状态。关键在于:**单纯调用 back() 或 go(-1) 只触发导航,不会自动保存或恢复页面状态;状态保持必须手动配合 history API 实现。**
用 back() 和 go() 控制前进后退
back() 等价于点击浏览器“后退”按钮,forward() 等价于“前进”,go(n) 则按步数跳转(n 为正向前进,负数为后退)。
-
history.back()—— 返回上一页(等同于history.go(-1)) -
history.forward()—— 前进到下一页(等同于history.go(1)) -
history.go(-2)—— 后退两页 -
history.go(0)—— 刷新当前页(重新加载,不新增历史条目)
注意:back() 和 go() 是同步操作,立即触发导航;但若历史栈不足(比如已在首页还调用 back()),则无效果,也不会报错。
history.pushState() 添加新状态条目
想在不刷新页面的前提下改变 URL 并保存状态,要用 pushState()。它向历史栈添加一条新记录,并可附带任意 JS 对象作为状态数据。
立即学习“Java免费学习笔记(深入)”;
- 语法:
history.pushState(state, title, url) -
state:任意可序列化的对象(如{page: 'detail', id: 123}),后续可通过event.state获取 -
title:目前大多数浏览器忽略该参数,传空字符串''即可 -
url:新 URL,需同源(协议、域名、端口一致),否则抛错
例如:history.pushState({tab: 'settings'}, '', '/settings') 会把当前页 URL 改为 /settings,同时将 {tab: 'settings'} 存入该条目的状态中。
用 popstate 事件监听返回/前进并恢复状态
当用户点击浏览器前后按钮,或调用 back()/forward() 时,如果目标历史条目由 pushState() 或 replaceState() 创建,就会触发 popstate 事件。
- 监听方式:
window.addEventListener('popstate', event => { ... }) -
event.state就是当初传入pushState()的那个对象 - 该事件不包含导航方向信息,需自行记录或对比当前 URL 判断是前进还是后退
典型用法:在 popstate 回调里根据 event.state 重新渲染界面、恢复表单、滚动位置等。注意:页面首次加载时不会触发 popstate,即使 URL 包含状态数据。
replaceState() 替换当前状态而不新增条目
当需要更新当前页的状态或 URL,又不想增加历史记录(避免用户多按几次后退回到旧状态),用 replaceState()。
- 语法与
pushState()相同:history.replaceState(state, '', newUrl) - 它替换的是当前历史条目,不影响历史栈长度
- 同样会触发
popstate(如果用户随后导航离开再返回)
常见场景:表单提交后修正 URL、动态更新搜索参数、修复初始 URL 的 hash 或 query 等。
不复杂但容易忽略:back() 和 go() 本身不处理状态,状态保持完全依赖你主动用 pushState()/replaceState() 存储 + popstate 事件读取和还原。没做这一步,页面一后退就丢数据或白屏。


















