- 在历史记录中后退
window.history.back();
这行代码等效于在浏览器的工具栏上点击“返回“按钮。
- 在历史记录中前进
window.history.forward();
这行代码等效于在浏览器中点击“前进“按钮。
- 移动到指定的历史记录点
使用go()方法从当前会话的历史记录中加载页面。当前页面位置索引值为0,上一页就是-1,下一页为1,依此类推。
window.history.go(-1); //相当于调用back()
window.history.go(1); //相当于调用forward()
- length属性
使用length属性可以了解历史记录栈中一共有多少页。
var num = window.history.length;
- 添加和修改历史记录条目
HTML5新增history.pushState()和history.replaceState()方法,允许用户逐条添加和修改历史记录条目。
使用history.pushState()方法可以改变referrer的值,而在调用该方法后创建的XMLHttpRequest对象会在HTTP请求头中使用这个值。referrer的值则是创建XMLHttpRequest对象时所处的窗口的URL。
【示例】假设http://mysite.com/foo.html页面将执行下面JavaScript代码。
var stateObj = { foo: "bar" };
history.pushState(stateObj, "page 2", "bar.html");
这时浏览器的地址栏将显示http:// mysite.com/bar.html,但不会加载bar.html页面,也不会检查bar.html是否存在。
如果现在导航到http://mysite.com/页面,然后点击后退按钮,此时地址栏会显示http:// mysite.com/bar.html,并且会触发popstate事件,该事件中的状态对象会包含stateObj的一个拷贝。
如果再次点击后退按钮,URL将返回http://mysite.com/foo.html,文档将触发另一个popstate事件,这次的状态对象为null,回退同样不会改变文档内容。
- pushState()方法
pushState()方法包含三个参数,简单说明如下:
第1个参数:状态对象。
状态对象是一个JavaScript对象直接量,与调用pushState()方法创建的新历史记录条目相关联。无论何时用户导航到新创建的状态,popstate事件都会被触发,并且事件对象的state属性都包含历史记录条目的状态对象的拷贝。
第2个参数:标题。可以传入一个简短的标题,标明将要进入的状态。
FireFox浏览器目前忽略该参数,考虑到未来可能会对该方法进行修改,传一个空字符串会比较安全。
第3个参数:可选参数,新的历史记录条目的地址。
浏览器不会在调用pushState()方法后加载该地址,不指定的话则为文档当前URL。
【提示】
调用pushState()方法,类似于设置window.location='#foo',它们都会在当前文档内创建和激活新的历史记录条目。但pushState()有自己的优势:
- 新的URL可以是任意的同源URL,与此相反,使用window.location方法时,只有仅修改 hash 才能保证停留在相同的document中。
- 根据个人需要决定是否修改URL。相反,设置window.location='#foo',只有在当前hash值不是foo时才创建一条新历史记录。
- 可以在新的历史记录条目中添加抽象数据。如果使用基于hash的方法,只能把相关数据转码成一个很短的字符串。
注意,pushState()方法永远不会触发hashchange事件。
- replaceState()方法
history.replaceState()与history.pushState()用法相同,都包含3个相同的参数。不同之处:
pushState()是在history栈中添加一个新的条目,replaceState()是替换当前的记录值。例如,history栈中有两个栈块,一个标记为1,另一个标记为2,现在有第三个栈块,标记为3。当执行pushState()时,栈块3将被添加栈中,栈就有3个栈块了。而当执行replaceState()时,将使用栈块3替换当前激活的栈块2,history的记录条数不变。也就是说,pushState()会让history的数量加1。
【提示】
为了响应用户的某些操作,需要更新当前历史记录条目的状态对象或URL时,使用replaceState()方法会特别合适。
- popstate事件
每当激活的历史记录发生变化时,都会触发popstate事件。如果被激活的历史记录条目是由pushState()创建,或者是被replaceState()方法替换的,popstate事件的状态属性将包含历史记录的状态对象的一个拷贝。
【注意】
当浏览会话历史记录时,不管是点击浏览器工具栏中前进或者后退按钮,还是使用JavaScript的history.go()和history.back()方法,popstate事件都会被触发。
- 读取历史状态
在页面加载时,可能会包含一个非空的状态对象。这种情况是会发生的,例如,如果页面中使用pushState()或replaceState()方法设置了一个状态对象,然后重启浏览器。当页面重新加载时,页面会触发onload事件,但不会触发popstate事件。但是,如果读取 history.state 属性,会得到一个与popstate 事件触发时一样的状态对象。
可以直接读取当前历史记录条目的状态,而不需要等待popstate事件。
var currentState = history.state;