JavaScript 通过 history.pushState() 和 replaceState() 操作同源历史栈,支持无刷新更新 URL 和状态;popstate 事件监听导航变化;back/forward/go 仅限已存在历史项跳转,且需用户手势触发。
JavaScript 可以读取、跳转甚至修改当前标签页的浏览历史,但受同源策略和隐私限制,无法获取其他网站的历史记录,也不能直接读取完整 URL 列表。它的核心能力集中在当前页面所在域名的历史栈操作上。
e() 添加新历史条目这个方法不会刷新页面,但会在浏览器历史中新增一条记录,并可更新 URL 和状态对象:
history.pushState(state, title, url)
state 是一个可序列化的对象,会在 popstate 事件中传回title 当前多数浏览器忽略,可传空字符串url 必须与当前页面同源(协议+域名+端口),可以是相对路径history.pushState({page: 2}, '', '?page=2'),地址栏变为 ?page=2,用户点返回会回到上一页和 pushState 类似,但不新增记录,而是覆盖当前这一项。常用于修正 URL 或避免用户重复提交:
/submit 改成 /success,防止刷新重复提交当用户点击前进/后退按钮,或 JS 调用 history.back() 等时触发:
window.addEventListener('popstate', handler) 绑定state 属性就是 pushState/replaceState 传入的状态对象JS 可以模拟浏览器按钮行为,但受限明显:
history.back()、history.forward()、history.go(n) —— 只能跳转已存在的历史项不复杂但容易忽略:所有 history API 操作都要求页面已完成加载,且必须在同源上下文中运行。现代前端框架(React Router、Vue Router)底层正是基于这些机制实现路由功能。