HTML4中的History API
history这个东西大家应该都不陌生,我们经常使用history.back(-1)来实现后退功能,具体的属性和方法如下:
属性
length 历史的项数。JavaScript所能管到的历史被限制在用浏览器的“前进”“后退”键可以去到的范围。本属性返回的是“前进”和“后退”两个按键之下包含的地址数的和。
方法
back() 后退,跟按下“后退”键是等效的。
forward() 前进,跟按下“前进”键是等效的。
go() 用法:history.go(x);在历史的范围内去到指定的一个地址。如果 x < 0,则后退 x 个地址,如果 x > 0,则前进 x 个地址,如果 x == 0,则刷新现在打开的网页。history.go(0) 跟 location.reload() 是等效的。
html5中的History API
history.pushState(data, title , url):往历史记录堆栈顶部添加一条记录;data会在onpopstate事件触发时作为参数传递过去;title为页面标题,当前所有浏览器都会忽略此参数;url为页面地址,可选,缺省为当前页地址。
history.replaceState(data, title , url) :更改当前的历史记录,参数同上。
history.state:用于存储以上方法的data数据,不同浏览器的读写权限不一样。
为什么要使用History API
在ajax给我们带来提高用户体验、减少HTTP连接数等好处的同时,也渐渐显露出一些不足之处,比如:
无法使用浏览器的前进、后退来切换前后数据。
当我们将浏览器地址栏中的链接与朋友分享时,可能实际上却并非我们期望的内容。
单纯地使用AJAX不利于搜索引擎优化。
浏览器兼容性
pushState, replaceState | 5 | 4.0(2.0) | -- | 11.50 | 5.0 |
history.state | -- | 4.0(2.0) | -- | 11.50 | -- |
案例代码:
<div class="container">
<div class="row">
<ul class="nav navbar-nav">
<li><a href="home.html" class="historyAPI">Home</a></li>
<li><a href="about.html" class="historyAPI">About</a></li>
<li><a href="contact.html" class="historyAPI">Contact</a></li>
</ul>
</div>
<div class="row">
<p>点击链接,ajax修改下面内容</p>
<p id="content"></p>
</div>
</div>
//检测浏览器是否支持history API
if(window.history && history.pushState){
alert('支持');
}else{
alert('不支持');
}
$('.historyAPI').on('click', function(e){
//阻止a标签默认跳转行为
e.preventDefault();
//获取新的href
var href = $(this).attr('href');
//根据新的href去执行的对应的操作,一般是用ajax进行内容刷新
$('#content').html('当前页面href是:/redbag/'+href);
//添加一条浏览器的历史记录
history.pushState(null, null, href);
});
//点击浏览器的前进后退按钮的时候出发
window.addEventListener("popstate", function(e) {
$('#content').html('当前页面href是:'+location.pathname);
});