HTML5提供history接口,把URL以state的形式添加或者替换到浏览器中,其实现函数正是 pushState 和 replaceState。
pushState 例子
pushState() 的基本参数是:
window.history.pushState(state, title, url); |
其中state和title都可以为空,但是推荐不为空,应当创建state来配合popstate监听。
例如,我们通过pushState现改变URL而不刷新页面。
//code from http://caibaojian.com/book/ |
其中带有“”符号的是自定义内容。就可以把这个href(URL)推送到浏览器的历史里。
如果想要改变网页的标题,应该:
document.title= ~newTitle; |
注意只是pushState是不能改变网页标题的哦。
Demo 演示
(实现函数onclick = history.pushState( null, null, ‘/book/‘); )。
实际上这个博客在文章之间也部署了这个技术。
replaceState 同理
window.history.replaceState( state, ~title, ~href); |
pushState、replaceState 的区别
pushState()可以创建历史,可以配合popstate事件,而replaceState()则是替换掉当前的URL,不会产生历史。
限制因素
只能用同域的URL替换,例如你不能用http://baidu.com去替换http://google.com。
而且state对象不存储不可序列化的对象如DOM。
Ajax 配合 pushState 例子
现在用Ajax + pushState来提供全新的ajax调用风格。以jQuery为例,为了seo需要,
应该为a标签的onclick添加方法。·
$("~target a").click(function(evt){ |
即可完成pushState。至于新标题newTitle的获取就是另外的问题了,例如你可以为a标签分配>·
另外如果需要对新加载的页面的连接同样使用这个ajax,则需要对新内容的a标签重新部署,例如
$("~newContentTarget a").click(function(evt){ |
pushState 配合 popstate 监听
注意:
调用history.pushState()或者history.replaceState()不会触发popstate事件. popstate事件只会在浏览器某些行为下触发, 比如点击后退、前进按钮(或者在JavaScript中调用history.back()、history.forward()、history.go()方法).
//绑定事件处理函数. |