

新闻资讯
技术学院history.pushState 和 replaceState 的核心区别在于:pushState 在历史栈新增记录,replaceState 仅替换当前条目;前者支持返回上一页,后者不改变后退路径。
两者都用来修改浏览器地址栏,但 pushState 会在历史栈中新增一条记录,而 replaceState 只替换当前条目,不增加新记录。这意味着调用 replaceState 后按浏览器「后退」按钮不会回到上一个 URL,而是继续回退到更早的页面。
pushState 适合页面内导航(如切换 Tab、翻页),用户希望保留返回路径replaceState 适合修正当前 URL(如去掉 hash、补全 query 参数),不希望干扰用户历史行为title 在多数浏览器中被忽略,可传空字符串或 null
state 必须是可序列化的对象,不能是函数或 DOM 节点,否则会抛 DataCloneError
浏览器点击后退/前进按钮,或调用 history.back()、history.forward() 时,会触发 popstate 事件。注意:仅当历史记录由 pushState 或 replaceState 创建(或初始页面加载)才会触发,直接跳转普通链接不会触发。
state 属性就是当时传入 pushState 或 replaceState 的第一个参数addEventListener('popstate', handler) 注册,不能用 onpopstate(部分浏览器不支持)popstate,Safari 会——需要手动检查 history.state 做兼容window.addEventListener('popstate', (event) => {
const state = event.state;
if (state && state.page === 'list') {
renderList(state.query);
}
});
这三个方法都依赖浏览器历史栈,但控制粒度不同。它们不会触发 popstate 事件(只有用户操作或 go() 引起的跳转才触发),且无法跨域跳转(遇到跨域记录会静默失败)。
history.back() 等价于 history.go(-1)
,但语义更清晰history.go(0) 是刷新当前页,但不会重新发送 POST 请求(类似 F5 的行为)history.go(n) 时若目标超出历史栈范围(如 go(100)),浏览器静默忽略,不报错也不跳转pushState 和 replaceState 的第二个参数(URL)必须与当前页面同源,否则抛 SecurityError。即使只是相对路径,也受当前 document.URL 影响;如果当前是 file:// 协议,几乎所有操作都会失败。
/ 开头,或完整协议+域名(但必须同源)/a/b/,传 'c' 会变成 /a/b/c;传 '../c' 则可能越界)new URL('/path', location.href).href 构造安全 URL/user/123),否则用户直接访问会 404