H5系列之History(必知必会)
- 理解History Api的使用方式
- 目的是为了解决哪些问题
【01】
【】在使用HTML5的状态管理机制时,请确保使用pushState()创造的每一个“假”URL,在Web服务器上都有一个真的、实际存在的URL与之对应。否则,单击“刷新”按钮会导致404错误。
先来看看"history"接口的详细方法:
interface History {
readonly attribute long length;
readonly attribute any state;
void go(optional long delta);
void back();
void forward();
void pushState(any data, DOMString title, optional DOMString? url = null);
void replaceState(any data, DOMString title, optional DOMString? url = null);
};
为了提高Web页面的响应速度,越来越多的开发者开始采用单页面结构(single-page application)的解决方案。
所谓的单页面结构就是指多个页面间切换时,不刷新当前整个页面,更新页面展示数据,并且相应地改变地址栏中的url,以使用户可以分享这个url。
如果你使用chrome或者firefox等浏览器访问"github.com、plus.google.com"等网站时,细心的你会发现页面之间的点击是通过ajax异步请求的,
同时页面的URL发生了改变。并且能够很好的支持浏览器前进和后退。
为了用变成方式确定浏览器是否支持这个API,可以用下面的一行代码检验:
如果你是用的现代浏览器,可以用下面的代码:
如果你的浏览器不支持History API,可以使用history.js代替。
**
属性
if (history.length == 0){
//这应该是用户打开窗口后的第一个页面
}
history.length
<html>
<body>
<scripttype="text/javascript">
console.log(history.length);
</script>
</body>
</html>
**
history.pushState({name:"魔芋"},"moyu","moyu.html");
console.log(history.state);
**
语法
history.forward()
实例
下面的例子可以在页面上创建一个前进按钮:
<html>
<head>
<scripttype="text/javascript">functiongoForward()
{
window.history.forward()
}
</script>
</head>
<body>
<inputtype="button"value="Forward"onclick="goForward()" />
</body>
</html>
back() 方法
定义和用法
back() 方法可加载历史列表中的前一个 URL(如果存在)。
调用该方法的效果等价于点击后退按钮或调用 history.go(-1)。
等同于点击浏览器的后退按钮。
语法:
history.back()
例子:
<html>
<head>
<scripttype="text/javascript">functiongoBack()
{
window.history.back()
}
</script>
</head>
<body>
<inputtype="button"value="Back"onclick="goBack()" />
</body>
</html>
**
定义和用法
go() 方法可加载历史列表中的某个具体的页面。
语法
history.go(number|URL)
history.go(-2);// 后退两个历史记录,相当于单击"后退"按钮两次
go(1) ;//前进一个;
go(-1) ; /后退一个;
说明
URL 参数使用的是要访问的 URL,或 URL 的子串。而 number 参数使用的是要访问的 URL 在 History 的 URL 列表中的相对位置。
也可以给go()方法传递一个字符串参数,此时浏览器会跳转到历史记录中包含该字符串的第一个位置——可能后退,也可能前进,具体要看哪个位置最近。
如果历史记录中不包含该字符串,那么这个方法什么也不做,例如:
//跳转到最近的wrox.com页面
history.go("wrox.com");
//跳转到最近的nczonline.net页面
history.go("nczonline.net");
history.go(0)相当于刷新当前页面。实例
下面例子会加载历史列表中的前一个页面:
<html>
<head>
<scripttype="text/javascript">functiongoBack()
{
window.history.go(-1)
}
</script>
</head>
<body>
<inputtype="button"value="Back"onclick="goBack()" />
</body>
</html>
但是,浏览器并不会真的向服务器发送请求,即使状态改变之后查询location.href也会返回与地址栏中相同的地址。
另外,第二个参数目前还没有浏览器实现,因此完全可以只传入一个空字符串,或者一个短标题也可以。
history.pushState(javascriptObj,"some string","url");
history.pushState({username: "html5"}, "user account", "user.html");
<script>
history.pushState({username: "html5"}, "user account", "c.html");
console.log(history);
</script>
.html是否存在,它只是成为浏览历史中的最新记录。

pushState方法不会触发页面刷新,只是导致history对象发生变化,地址栏会有反应。如果pushState的url参数,设置了一个新的锚点值(即hash),并不会触发hashchange事件。如果设置了一个跨域网址,则会报错。
history.pushState({title: 'twitter'}, 'twitter', 'https://twitter.com/moyu')
上面代码中,pushState想要插入一个跨域的网址,导致报错。
这样设计的目的是,防止恶意代码让用户以为他们是在另一个网站上。
在Safari和Chrome中,传递给pushState()或replaceState()的状态对象中不能包含DOM元素。
而Firefox支持在状态对象中包含DOM元素。
Opera还支持一个history.state属性,它返回当前状态的状态对象。
**
history.replaceState({username: "html5" }, "user account", "user.html");
**
pushState()会创建新的历史状态,会发现“后退”按钮也能使用了。
按下“后退”按钮,会触发window对象的popstate事件。
history对象)发生变化时,就会触发popstate事件。history.pushState()或history.replaceState()方法时,并不会触发popstate事件。history.back()、history.forward()和history.go()方法时才会触发。popstate事件只针对同一个文档,如果浏览器历史的切换,导致加载不同的文档,该事件也不会被触发。window.onpopstate = function(event){
console.log(event.state); //输出pushState()或者replaceState()设置的state信息
}
也可以这样使用:
window.addEventListener('popstate', function(event) {
console.log('location: ' + document.location)
console.log('state: ' + JSON.stringify(event.state))
})
<div id="click-item"></div>
<div id="result-item"></div>
<script type="text/javascript">
var clickItem = document.getElementById('click-item');
var resultItem = document.getElementById('result-item');
clickItem.onclick = function(){
resultItem.innerHTML = 'clicked!';
history.pushState({note: 'set result'}, '', 'result.html');
}
</script>
popstate事件的事件对象有一个state属性,这个属性就包含着当初以第一个参数传递给pushState()的状态对象。
popstate事件发生后,事件对象中的状态对象(event.state)是当前状态。
EventUtil.addHandler(window, "popstate", function(event){
var state = event.state;
if (state){ //第一个页面加载时state为空
processState(state);
}
});
得到这个状态对象后,必须把页面重置为状态对象中的数据表示的状态(因为浏览器不会自动为你做这些)。
记住,浏览器加载的第一个页面没有状态,因此单击“后退”按钮返回浏览器加载的第一个页面时,event.state值为null。
注意:页面第一次加载的时候,在load事件发生后,Chrome和Safari浏览器(Webkit内核)会触发popstate事件,而Firefox和IE浏览器不会。
**
H5系列之History(必知必会)的更多相关文章
- H5系列之地理位置(必知必会)
H5之地理位置必知必会 [02]概念 规范地址:http://www.w3.org/TR/geolocation-API/ HTML5 Geolocation(地理定位)用于定位用 ...
- mysql必知必会系列(一)
mysql必知必会系列是本人在读<mysql必知必会>中的笔记,方便自己以后查看. MySQL. Oracle以及Microsoft SQL Server等数据库是基于客户机-服务器的数据 ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- SQL 必知必会
本文介绍基本的 SQL 语句,包括查询.过滤.排序.分组.联结.视图.插入数据.创建操纵表等.入门系列,不足颇多,望诸君指点. 注意本文某些例子只能在特定的DBMS中实现(有的已标明,有的未标明),不 ...
- 《MySQL必知必会》[01] 基本查询
<MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...
- Android程序员必知必会的网络通信传输层协议——UDP和TCP
1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...
- 《MySQL必知必会》整理
目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...
- 迈向高阶:优秀Android程序员必知必会的网络基础
1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用 ...
- 脑残式网络编程入门(三):HTTP协议必知必会的一些知识
本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...
随机推荐
- 07.Javascript——入门高阶函数
高阶函数英文叫Higher-order function..JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数 ...
- ruby 正则匹配返回值matchdata
引用连接: 为处理与正则表达式的匹配过程相关的信息而设置的类. 可以通过下列途径 Regexp.last_match Regexp#match, String#match $~ 得到该类的实例. 超类 ...
- ACCESS中通过一个字段补齐更新另一个字段
[干货从下面红字开始] 搞了好久的一个问题终于有结果…… 根据学生进出馆的次数和学生报名人数来分配自习间 学生报名是通过工号(学号)来报名的: 而门禁系统统计出来的数据有绝一大部分仅有 卡号没有 工号 ...
- PaaS优点与限制(3)
PaaS优点与限制(3) PaaS学习笔记目录 PaaS基础学习(1) 在PaaS上开发Web.移动应用(2) PaaS优点与限制(3) 13. PaaS的核心服务 核心服务是指提供数据存储.SQl. ...
- Android 视频录制 java.lang.RuntimeException: start failed.
//mRecorder.setVideoSize(320, 280); // mRecorder.setVideoFrameRate(5); mRecorder.setOutputFile(viodF ...
- 自动完成文本框(AutoCompleteTextView与MultiAutoCompleteTextView)关联适配器
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...
- 中国区 Azure 和全球版 Azure:功能对比
由世纪互联运营的 Microsoft Azure(文中简称为中国区 Azure)是在中国大陆独立运营的公有云平台,与全球其他地区由微软运营的 Azure (文中简称全球版 Azure)服务在物理上和逻 ...
- SQL增删查改语句
一.增:有4种方法 1.使用insert插入单行数据: 语法:insert [into] <表名> [列名] values <列值> insert into sheet1 va ...
- spring (由Rod Johnson创建的一个开源框架)
你可能正在想“Spring不过是另外一个的framework”.当已经有许多开放源代码(和专有)J2EEframework时,我们为什么还需要Spring Framework? Spring是独特的, ...
- js 两个数组进行去重处理,返回去重后的数组
1.去重的方法为: array_diff(a, b) { for (var i = 0; i < b.length; i++) { for (var j = 0; j < a.length ...