history 对象
难度:⭐️
💌
history对象表示当前窗口首次使用以来用户的导航历史记录。因为history是window的属性,所以每个window都有自己的history对象。出于安全考虑,这个对象不会暴露用户访问过的 URL,但可以通过它在不知道实际 URL 的情况下前进和后退。
导航
方法:
go()forward()back()属性:length
👉 go()
js
// 后退一页
history.go(-1);
// 前进一页
history.go(1);
// 前进两页
history.go(2);
👉 forward() & back()
js
// 后退一页
history.back();
// 前进一页
history.forward();
此外,history 对象还有一个 length 属性,表示历史记录中有多个条目。通过以下方法测试这个值,可以确定用户浏览器的起点是不是你的页面:
js
if (history.length == 1){
// 这是用户窗口中的第一个页面
}
✨
history对象通常被用于创建“后退”和“前进”按钮,以及确定页面是不是用户历史记录中的第一条记录。
历史状态管理
pushState()popState()replaceState()
🤔 现代 Web 应用程序开发中最难的环节之一就是历史记录管理。为解决这个问题,首先出现的是 hashchange 事件。HTML5 也为 history 对象增加了方便的状态管理特性。
hashchange 会在页面 URL 的散列变化时被触发,开发者可以在此时执行某些操作。而状态管理 API 则可以让开发者改变浏览器 URL 而不会加载新页面。
- 可以使用
history.pushState()方法。这个方法接收 3 个参数:一个state对象、一个新状态的标题 和 一个(可选的)相对 URL。例如:
js
let stateObject = {foo:"bar"};
history.pushState(stateObject, "My title", "baz.html");
pushState()方法执行后,状态信息就会被推到历史记录中,浏览器地址栏也会改变以反映新的相对 URL。
- 因为
pushState()会创建新的历史记录,所以也会相应地启用“后退”按钮。此时单击“后退”按钮,就会触发 window 对象上的popstate事件:
js
window.addEventListener("popstate", (event) => {
let state = event.state;
if (state) { // 第一个页面加载时状态是 null
processState(state);
}
});
- 也可以使用
replaceState()并传入与pushState()同样的前两个参数来更新状态。更新状态不会创建新历史记录,只会覆盖当前状态:
js
history.replaceState({newFoo: "newBar"}, "New title");