做者:zccst
旧版:
forword()
backword()
go(number)
HTML5中新增了
onhashchange 浏览器兼容性较好,用得较多
pushState / replaceState / onpopState
1、onhashchange
hashchange事件在当前页面URL中的hash值发生改变时触发 (查看location.hash).
区别:
经过window.onpopstate来监听url的变化,但会忽略URL的hash部分。
结论:二者偏偏互补,各有分工。
javascript
hashchange 事件对象有下面两个属性
newURL DOMString 当前页面新的URL
oldURL DOMString 当前页面旧的URL
2、pushState / replaceState / onpopState
(通俗易懂版)
HTML5的新API扩展了window.history,使历史记录点更加开放了。能够存储当前历史记录点、替换当前历史记录点、监听历史记录点,下面逐一简要说明一下。
一、存储当前历史记录点
存储的方式相似于数组的入栈(Array.push()),在window.history里新增一个历史记录点,例如:
// 当前的url为:http://qianduanblog.com/index.html
var json={time:new Date().getTime()};
// @状态对象:记录历史记录点的额外对象,能够为空
// @页面标题:目前全部浏览器都不支持
// @可选的url:浏览器不会检查url是否存在,只改变url,url必须同域,不能跨域
window.history.pushState(json,"","http://qianduanblog.com/post-1.html");
执行了pushState方法后,页面的url地址为http://qianduanblog.com/post-1.html。
二、替换当前历史记录点
window.history.replaceState和window.history.pushState相似,不一样之处在于replaceState不会在window.history里新增历史记录点,其效果相似于window.location.replace(url),都是不会在历史记录点里新增一个记录点的。当你为了响应用户的某些操做,而要更新当前历史记录条目的状态对象或URL时,使用replaceState()方法会特别合适。
三、监听历史记录点
监听历史记录点,直观的可认为是监听URL的变化,但会忽略URL的hash部分,监听URL的hash部分,HTML5有新的API为onhashchange,个人博客里也有说到该方法和跨浏览器的兼容解决方案。能够经过window.onpopstate来监听url的变化,而且能够获取存储在该历史记录点的状态对象,也就是上文说到的json对象,如:
// 当前的url为:http://qianduanblog.com/post-1.html
window.onpopstate=function()
{
// 得到存储在该历史记录点的json对象
var json=window.history.state;
// 点击一次回退到:http://qianduanblog.com/index.html
// 得到的json为null
// 再点击一次前进到:http://qianduanblog.com/post-1.html
// 得到json为{time:1369647895656}
}
值得注意的是:javascript脚本执行window.history.pushState和window.history.replaceState不会触发onpopstate事件。
(文绉绉版)
HTML5引进了history.pushState()方法和history.replaceState()方法,它们容许你逐条地添加和修改历史记录条目。这些方法能够协同window.onpopstate事件一块儿工做。
1,pushState()
某种意义上,调用pushState()有点相似于设置window.location='#foo',它们都会在当前文档内建立和激活新的历史记录条目。但pushState()有本身的优点:
新的URL能够是任意的同源URL,与此相反,使用window.location方法时,只有仅修改 hash 才能保证停留在相同的document中。
根据我的须要来决定是否修改URL。相反,设置window.location='#foo',只有在当前hash值不是foo时才建立一条新历史记录。
你能够在新的历史记录条目中添加抽象数据。若是使用基于hash的方法,你只能把相关数据转码成一个很短的字符串。
注意pushState()方法永远不会触发hashchange事件,即使新的地址只变动了hash。
2,replaceState()方法
history.replaceState()操做相似于history.pushState(),不一样之处在于replaceState()方法会修改当前历史记录条目而并不是建立新的条目。
当你为了响应用户的某些操做,而要更新当前历史记录条目的状态对象或URL时,使用replaceState()方法会特别合适。
3,popstate事件
每当激活的历史记录发生变化时,都会触发popstate事件。若是被激活的历史记录条目是由pushState所建立,或是被replaceState方法影响到的,popstate事件的状态属性将包含历史记录的状态对象的一个拷贝。
举例:
history.pushState
菊花插一刀之意,用法举例:
history.pushState({}, "页面标题", "xxx.html");
history.pushStatehistory.replaceState
换把菊花刀之意,用法举例:
history.replaceState(null, "页面标题", "xxx.html");
window.onpopstate
在菊花刀拔插的时候……,用法举例:
window.addEventListener("popstate", function() {
var currentState = history.state;
/*
* 该干吗干吗
*/
});
完整实例:
http://www.zhangxinxu.com/wordpress/2013/06/html5-history-api-pushstate-replacestate-ajax/
策略以下:
每次手动点击左侧的菜单,我将Ajax地址的查询内容(?后面的)附在demo HTML页面地址后面,使用history.pushState塞到浏览器历史中。
浏览器的前进与后退,会触发window.onpopstate事件,经过绑定popstate事件,就能够根据当前URL地址中的查询内容让对应的菜单执行Ajax载入,实现Ajax的前进与后退效果。
页面首次载入的时候,若是没有查询地址、或查询地址不匹配,则使用第一个菜单的Ajax地址的查询内容,并使用history.replaceState更改当前的浏览器历史,而后触发Ajax操做。 html