History API
History 接口允许操作浏览器的会话历史记录。
History API 的方法和属性
属性 | 是否只读 | 类型 | 作用 |
---|---|---|---|
history.length |
只读 | 整数 | history 堆栈中会话的数量 |
history.state |
只读 | object | 返回一个表示历史堆栈顶部的状态的值 |
history.scrollRestoration |
否 | auto|manual (string) | 允许Web应用程序在历史导航上显式地设置默认滚动恢复行为 |
方法 | 作用 |
---|---|
history.back() |
在浏览器历史记录里前往上一页, 用户可点击浏览器左上角的返回按钮模拟此方法. 等价于 history.go(-1) |
history.forward() |
在浏览器历史记录里前往下一页,用户可点击浏览器左上角的前进按钮模拟此方法. 等价于 history.go(1) |
history.go() |
入参为整数,通过当前页面的相对位置从浏览器历史记录加载页面。 |
history.pushState(state, title[, url]) |
按指定的名称和URL(如果提供该参数)将数据 push 进会话历史栈,数据被 DOM 进行不透明处理;可以指定任何可以被序列化的 javascript 对象。 |
history.replaceState(state, title[, url]) |
按指定的数据,名称和URL(如果提供该参数),更新历史栈上最新的入口。这个数据被 DOM 进行了不透明处理。你可以指定任何可以被序列化的 javascript 对象。 |
History API 用法
History API 最常见的用法是通过 pushState()
方法添加浏览器url历史(浏览器不会加载该 url ,甚至不会检查 url 是否真的存在),这样,在回退的时候就会加载 history 堆栈中的页面。在某种意义上,调用 pushState()
与 设置 window.location = "#foo"
类似,二者都会在当前页面创建并激活新的历史记录。但 pushState()
具有如下几条特点:
- 新的 URL 可以是与当前 URL 同源的任意 URL 。相反,只有在修改哈希时,设置
window.location
才能是同一个 document。 - 如果你不想改 URL ,就不用改。相反,设置
window.location = "#foo";
在当前哈希不是 #foo 时,才能创建新的历史记录项。 - 你可以将任意数据和新的历史记录项相关联。而基于哈希的方式,要把所有相关数据编码为短字符串。
- 如果 标题(title 随后还会被浏览器所用到,那么这个数据是可以被使用的(哈希则不是)。
pushState()
不会触发 hashchange 事件,即使新的 URL 与旧的 URL 仅哈希不同也是如此
每当活动的历史记录项发生变化时, popstate 事件都会被传递给 window 对象。如果当前活动的历史记录项是被 pushState()
创建的,或者是由 replaceState()
改变的,那么 popstate 事件的状态属性 state 会包含一个当前历史记录状态对象的拷贝。
参考: https://developer.mozilla.org/zh-CN/docs/Web/API/History