一、popstate
每当处于激活状态的历史记录条目发生变化时,popstate
事件就会在对应window对象上触发. 如果当前处于激活状态的历史记录条目是由history.pushState()
方法创建,或者由history.replaceState()
方法修改过的, 则popstate事件对象的state属性包含了这个历史记录条目的state对象
的一个拷贝.
调用history.pushState()
或者history.replaceState()
不会触发popstate事件. popstate事件只会在浏览器某些行为下触发, 比如点击后退、前进按钮(或者在JavaScript中调用history.back()、history.forward()、history.go()方法).
二、在history中跳转
使用 back(), forward()和 go() 方法来完成在用户历史记录中向后和向前的跳转。
三、添加和修改历史记录中的条目
3.1 pushState()
假设在 http://mozilla.org/foo.html 中执行了以下 JavaScript 代码:
let stateObj = {
foo: "bar",
};
history.pushState(stateObj, "page 2", "bar.html");
这将使浏览器地址栏显示为 http://mozilla.org/bar.html,但并不会导致浏览器加载 bar.html ,甚至不会检查bar.html 是否存在。
假设现在用户又访问了 http://google.com,然后点击了返回按钮。此时,地址栏将显示 http://mozilla.org/bar.html,history.state 中包含了 stateObj 的一份拷贝。页面此时展现为bar.html。且因为页面被重新加载了,所以popstate事件将不会被触发。
如果我们再次点击返回按钮,页面URL会变为http://mozilla.org/foo.html,文档对象document会触发另外一个 popstate 事件,这一次的事件对象state object为null。
注意 pushState() 绝对不会触发 hashchange 事件,即使新的URL与旧的URL仅哈希不同也是如此.
3.2 replaceState()
history.replaceState() 的使用与 history.pushState() 非常相似,区别在于 replaceState() 是修改了当前的历史记录项而不是新建一个。 注意这并不会阻止其在全局浏览器历史记录中创建一个新的历史记录项。
假设 http://mozilla.org/foo.html 执行了如下JavaScript代码:
let stateObj = {
foo: "bar",
};
history.pushState(stateObj, "page 2", "bar.html");
上文2行代码可以在 "pushState()方法示例" 部分找到。然后,假设http://mozilla.org/bar.html执行了如下 JavaScript:
history.replaceState(stateObj, "page 3", "bar2.html");
这将会导致地址栏显示http://mozilla.org/bar2.html,,但是浏览器并不会去加载bar2.html 甚至都不需要检查 bar2.html 是否存在。
假设现在用户重新导向到了http://www.microsoft.com,然后点击了回退按钮。这里,地址栏会显示http://mozilla.org/bar2.html。假如用户再次点击回退按钮,地址栏会显示http://mozilla.org/foo.html,完全跳过了bar.html。