JavaScript History API 允许不刷新页面修改 URL、添加或替换历史记录,用于 SPA 路由管理;pushState 添加新记录,replaceState 替换当前记录,popstate 监听导航变化,但无法跨域、读取历史内容或删除记录。
JavaScript 通过 History API 提供对浏览器会话历史的可控访问,不刷新页面即可修改 URL、添加记录或跳转,常用于单页应用(SPA)的路由管理。
调用 history.pushState(state, title, url) 可向历史栈插入一条新记录:
"")例如:history.pushState({page: "detail", id: 123}, "", "/item/123"); ——
地址栏变为 /item/123,但不触发页面加载。
history.replaceState(state, title, url) 不新增记录,而是替换当前条目,适合更新 URL 但不想让用户多按一次“后退”:
pushState 相同history.replaceState(null, "", "?sort=price&order=desc");
用户点击浏览器前进/后退按钮,或 JS 调用 history.back()、history.forward()、history.go(n) 时,会触发 popstate 事件:
window 上监听:window.addEventListener("popstate", (e) => { console.log(e.state); });
e.state 是之前 pushState 或 replaceState 传入的状态对象pushState/replaceState 不会触发该事件History API 不能跨域操作,也不能读取历史栈内容(如获取上一页 URL),出于隐私保护,JS 无法获知用户历史记录长度或具体地址:
history.length 仅返回当前会话中历史条目数量,不可靠且不包含 iframe 历史/item/123 时能返回对应页面(前端路由需服务端 fallback)