一、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>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="javascript:void(0)" id="replacestate">history.replaceState(data, title [, url]) </a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="javascript:void(0)" id="onpopstate">window.onpopstate</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<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实践的更多相关文章

  1. 一篇文章图文并茂地带你轻松实践 HTML5 history api

    HTML5 history api 前言 由于笔者在网络上没有找到比较好的关于 history api 的实践案例,有的案例过于杂乱,没有重点,有些案例只是告诉读者 api 是什么,却没告诉怎么用,本 ...

  2. html5 history api

    1.html5 history api适用场景,个人理解最大的用处是配合ajax使用,使ajax拥有回退.前进的用户体验. 2.代码(dive into html5中的一个小例子) 1)fer.htm ...

  3. 转: html5 history api详解~很好的文章

    从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残按到了F5.然后,页面刷新了,评论又回到了第一页 ...

  4. HTML5 History API & URL 重定向

    HTML5 History API & URL 重定向 disabled server url redirect https://developer.mozilla.org/en-US/doc ...

  5. HTML5 History API让ajax能回退到上一页

    HTML5 History API提供了一种功能,能让开发人员在不刷新整个页面的情况下修改站点的URL.这个功能很有用,例如通过一段JavaScript代码局部加载页面的内容,你希望通过改变当前页面的 ...

  6. window.history的跳转实质-HTML5 history API 解析

    在上一浏览器跳转行为的测试中,我们看到了通过不同的方法操作浏览器跳转时,它的刷新表现有所不同,在这一文章中,将看看,为何会产生这样的不同?其背后的实质是什么?浏览器的访问历史记录到底是如何运作的呢? ...

  7. HTML5 history API,创造更好的浏览体验

    HTML5 history API有什么用呢? 从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残 ...

  8. 转:HTML5 History API 详解

    从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残按到了F5.然后,页面刷新了,评论又回到了第一页 ...

  9. HTML5 History API 实现无刷新跳转

     在HTML5中, 1. 新增了通过JS在浏览器历史记录中添加项目的功能. 2. 在不刷新页面的前提下显示改变浏览器地址栏中的URL. 3. 添加了当用户单击浏览器的后退按钮时触发的事件. 通过以上三 ...

随机推荐

  1. verilog循环结构

    1. always(posedge CLOCK) . case(i) . . : . ) ’d0; i <= i + ’b1; end . ’b1; C1 <= C1 + ’b1; end ...

  2. C# 小工具开发--DeBugHttp

    随着RESTful的流行,前后端分离,我们后端开发人员在开发过程中多http相关方法进行测试.这就是这个小工具的初衷. 代码地址:https://github.com/gdoujkzz/DebugHt ...

  3. fuse入门

    参考1 http://www.cs.nmsu.edu/~pfeiffer/fuse-tutorial/html/running.html 参考2 http://www.maastaar.net/fus ...

  4. 菜单的隐藏&显示

    //还是先上万一老师的原代码 //隐藏与显示菜单Self.Menu := nil; {隐藏菜单} Self.Menu := MainMenu1; {显示菜单} //初一看到代码,我有点抓不到感觉的意思 ...

  5. html5表单验证

    表单验证为终端用户检测无效的数据并标记这些错误,是一种用户体验的优化. 下面展现浏览器自带的验证功能也可在移动端中查看: HTML部分: <!DOCTYPE html> <html ...

  6. JAVA求圆的面积

    import java.text.DecimalFormat;import java.util.Scanner; public class TheAreaOfCircle { public stati ...

  7. home键通知

    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("closeAlert"), n ...

  8. mac下svn问题——“.a”(静态库)文件无法上传解决

    mac下svn问题——“.a”(静态库)文件无法上传解决    “.a”(静态库)文件无法上传(svn工具:Versions)          网上查询了一下,说是Xcode自带的svn和Versi ...

  9. PPT开发 * .pps 文件类型

    PPT开发, * .pps ,文件类型 PPS 这个格式也是PowerPoint文件格式的一种. pps的意思是说PowerPoint Show,POWER POINT会直接生成预览形式为你放映幻灯片 ...

  10. localStorage, localforage, web sql三者的比较

    最近的项目中用到了前端存储,最初选用的是localStorage,这个是html5里面新增的API,用法很简单.setItem getItem clear. 值得注意的是,localStorage中存 ...