HTML5 history API实践
一、history API知识点总结
在HTML4中,我们已经可以使用window.history对象来控制历史记录的跳转,可以使用的方法包括:
history.forward();//在历史记录中前进一步 history.back();//在历史记录中后退一步 history.go(n);//在历史记录中跳转n步,n=0则刷新当前页,n=-1则后退一步
在HTML5中,又新增了四个可用的API,包括:
history.pushState(data[,title][,url]);//向历史记录中追加一条记录,data是一个js对象,可以是任何格式的json数据,title参数暂时不起作用,我亲自试了也确实如此。参数url是指地址栏中的地址值,不填则保持当前url history.replaceState(data[,title][,url]);//替换当前页在历史记录中的信息。参数与上面一致。 history.state;//是一个属性,可以得到当前页的state信息。 window.onpopstate;//是一个事件,在点击浏览器后退按钮或js调用forward()、back()、go()时触发。监听函数中可传入一个event对象,event.state即为通过pushState()或replaceState()方法传入的data参数。
二、新API在实际中的使用
知道了有这些新API,我们可以如何利用它们呢?以下是两个相关的使用案例:
① 还原ajax程序中浏览器后退按钮的功能。其实这个应用已经被大家广泛熟知了,由于ajax的固有缺点(无法使用浏览器后退按钮返回上一页),通过在发起ajax请求时在历史记录中添加一条记录并修改地址栏中的值,来模拟一个正常的跳转,同时仍然保留ajax异步加载的优点。方法如下:
var title = '另一篇随笔';
var url = 'http://www.cnblogs.com/lvdabao/p/另一篇随笔.html';
var state = {title:title,url:url};
history.pushState(state,title,url);//第三个参数url的值将会出现在地址栏
点击下面按钮,注意地址栏的变化:
②保存异步请求的参数,在页面返回时重现原来页面上的动态数据。具体需求是这样的:比如我们处在一个搜索结果列表页,页面上的内容是根据搜索条件动态得到的,我们可以点击其中一项进行详情预览(发ajax请求),在详情页点击“返回”时,我们希望原来的搜索数据还在,而不是变回列表页初始加载时的数据。以前,我们可以用回传参数的方式解决这样的需求,但那样做的缺点就是有大量的数据需要来回传递,如果页面层级较多,将会很不方便。那么现在,我们结合使用history的onpopstate事件,便可用完成这样的功能。举例来说:
我要做一个介绍HTML5 history的页面,index.html中的代码如下:
<body>
<p>HTML5 history API 介绍</p>
<a href="javascript:void(0)" id="pushstate">history.pushState(data, title [, url])</a>
<a href="javascript:void(0)" id="replacestate">history.replaceState(data, title [, url]) </a>
<a href="javascript:void(0)" id="onpopstate">window.onpopstate</a>
<a href="javascript:void(0)" id="back">返回</a>
<div id="loaddiv"></div>
<script> $(function(){ var loaddiv = $('#loaddiv');
//点击不同的链接,分别在loaddiv中加载不同的内容
$('#pushstate').click(function(){
loaddiv.load('1.php?stype=push');
history.pushState({title:'push',url:'1.php?stype=push'});
});
$('#replacestate').click(function(){
loaddiv.load('1.php?stype=replace');
history.pushState({title:'replace',url:'1.php?stype=replace'});
});
$('#onpopstate').click(function(){
loaddiv.load('1.php?stype=onpop');
history.pushState({title:'onpop',url:'1.php?stype=onpop'});
}); //点击返回,让浏览器后退一步
$('#back').click(function(){
history.back();
});
//兼听popstate事件,可以取到e.state的值,其中保存了你调用pushState方法时传入的数据,根据数据中的url异步加载相应内容。便实现了点击返回时页面上的数据保持是上次加载过的。
window.onpopstate = function(e){
if(e.state){
loaddiv.load(e.state.url);
}
} });
</script>
</body>
我要分别介绍history的三个新特性,通过调用jquery的load方法来异步加载,发送一个请求到1.php,同时传递对应的参数。后台接受到请求后根据不同的参数返回不同的数据,php代码如下:
<?php
$type = $_REQUEST['stype'];
switch($type){
case 'push' :
echo 'history.pushState(data, title [, url]):往历史记录堆栈顶部添加一条记录;data会在onpopstate事件触发时作为参数传递过去;title为页面标题,当前所有浏览器都会 忽略此参数;url为页面地址,可选,缺省为';
break;
case 'replace' :
echo 'history.replaceState(data, title [, url]) :更改当前的历史记录,参数同上';
break;
case 'onpop' :
echo 'window.onpopstate:响应pushState或replaceState的调用;';
break;
}
?>
我在这里无法上传php文件,你可以将代码复制到本地服务器测试。如此一来,便可以实现像github那样的页面加载机制。
以上便是我所见到过的关于history的两点使用方法。有发现错误欢迎指正,其他观点也欢迎交流。
HTML5 history API实践的更多相关文章
- 一篇文章图文并茂地带你轻松实践 HTML5 history api
HTML5 history api 前言 由于笔者在网络上没有找到比较好的关于 history api 的实践案例,有的案例过于杂乱,没有重点,有些案例只是告诉读者 api 是什么,却没告诉怎么用,本 ...
- html5 history api
1.html5 history api适用场景,个人理解最大的用处是配合ajax使用,使ajax拥有回退.前进的用户体验. 2.代码(dive into html5中的一个小例子) 1)fer.htm ...
- 转: html5 history api详解~很好的文章
从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残按到了F5.然后,页面刷新了,评论又回到了第一页 ...
- HTML5 History API & URL 重定向
HTML5 History API & URL 重定向 disabled server url redirect https://developer.mozilla.org/en-US/doc ...
- HTML5 History API让ajax能回退到上一页
HTML5 History API提供了一种功能,能让开发人员在不刷新整个页面的情况下修改站点的URL.这个功能很有用,例如通过一段JavaScript代码局部加载页面的内容,你希望通过改变当前页面的 ...
- window.history的跳转实质-HTML5 history API 解析
在上一浏览器跳转行为的测试中,我们看到了通过不同的方法操作浏览器跳转时,它的刷新表现有所不同,在这一文章中,将看看,为何会产生这样的不同?其背后的实质是什么?浏览器的访问历史记录到底是如何运作的呢? ...
- HTML5 history API,创造更好的浏览体验
HTML5 history API有什么用呢? 从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残 ...
- 转:HTML5 History API 详解
从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残按到了F5.然后,页面刷新了,评论又回到了第一页 ...
- HTML5 History API 实现无刷新跳转
在HTML5中, 1. 新增了通过JS在浏览器历史记录中添加项目的功能. 2. 在不刷新页面的前提下显示改变浏览器地址栏中的URL. 3. 添加了当用户单击浏览器的后退按钮时触发的事件. 通过以上三 ...
随机推荐
- verilog循环结构
1. always(posedge CLOCK) . case(i) . . : . ) ’d0; i <= i + ’b1; end . ’b1; C1 <= C1 + ’b1; end ...
- C# 小工具开发--DeBugHttp
随着RESTful的流行,前后端分离,我们后端开发人员在开发过程中多http相关方法进行测试.这就是这个小工具的初衷. 代码地址:https://github.com/gdoujkzz/DebugHt ...
- fuse入门
参考1 http://www.cs.nmsu.edu/~pfeiffer/fuse-tutorial/html/running.html 参考2 http://www.maastaar.net/fus ...
- 菜单的隐藏&显示
//还是先上万一老师的原代码 //隐藏与显示菜单Self.Menu := nil; {隐藏菜单} Self.Menu := MainMenu1; {显示菜单} //初一看到代码,我有点抓不到感觉的意思 ...
- html5表单验证
表单验证为终端用户检测无效的数据并标记这些错误,是一种用户体验的优化. 下面展现浏览器自带的验证功能也可在移动端中查看: HTML部分: <!DOCTYPE html> <html ...
- JAVA求圆的面积
import java.text.DecimalFormat;import java.util.Scanner; public class TheAreaOfCircle { public stati ...
- home键通知
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("closeAlert"), n ...
- mac下svn问题——“.a”(静态库)文件无法上传解决
mac下svn问题——“.a”(静态库)文件无法上传解决 “.a”(静态库)文件无法上传(svn工具:Versions) 网上查询了一下,说是Xcode自带的svn和Versi ...
- PPT开发 * .pps 文件类型
PPT开发, * .pps ,文件类型 PPS 这个格式也是PowerPoint文件格式的一种. pps的意思是说PowerPoint Show,POWER POINT会直接生成预览形式为你放映幻灯片 ...
- localStorage, localforage, web sql三者的比较
最近的项目中用到了前端存储,最初选用的是localStorage,这个是html5里面新增的API,用法很简单.setItem getItem clear. 值得注意的是,localStorage中存 ...