History API在各浏览器下的支持情况:
|
不支持 |
4.0+ |
5.0+ |
8.0+ |
不支持 |
比较典型的是GitHub,在点击代码文件夹和文件时,会发现它的url地址栏变换了、标题栏变化了、前进后退按钮也变化了(跟新开了一个新页面感觉一样),但体验起来很平滑(外层框架的内容没有重新加载,例如:登录信息、是否关注主人等),然后是ajax载入新内容。
history在HTML4的时代里,有如下几个方法和属性,应该很熟悉:
length、back()、forward()、go([delta])
在HTML5中又添加了两个方法:
pushState(data, title[,url])、replaceStage(data, this [,url])
需要注意的是在使用replaceStage,传入的url必须和当前页的协议、所在域完全相同(即使不同的子域都不行),否则会提示安全错误。
更多内容可以参考:
http://diveintohtml5.org/history.html
http://dev.w3.org/html5/spec-author-view/history.html
如果想在兼容其它老浏览器,可以使用History.js
这里写了一个测试实例,参考至:http://html5demos.com/history
因为URL变换了,而在刷新的时候页面又不能进行跳转,此时需要在自己的web服务器上写一些规则了(我本机使用的是nginx),在server_name为meteoric.com的vhost中添加如下规则:
location ~ ^/history/.*$ {
rewrite ^/history/.*$ /html5/history/index.html last;
}
页面访问路径是:http://meteoric.com/history/
这样即使我刷新页面,所有以history开头的请求,都将转至http://meteoric.com/history/index.html
/=======/
1、因为页面没有跳转,所以在点击链接的时候可以使用ajax请求并渲染数据(类似github的效果)
2、进页面,可以获取到当前URL,然后正则取出histroy其后的内容,判定加载哪一种资源
页面完整的HTML代码:
>
因为需要web服务器的支持,所以上述效果无法在blog中进行预览。需有兴趣,可搭建一个简单的环境进行测试~
如果有兴趣浏览兼容ie6+(无定时器)的history,可以阅读人人网前端开发人员的这篇文章:http://jingwei.li/blog/?p=183
之前我也写过一篇相关的文章:”不使用定时器实现的onhashchange”,代码有参阅人人网前台脚本(一时好奇就右击源码大致扫了一下)