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协议都是我们最常打交 ...
随机推荐
- AJPFX分享JAVA修饰符详解
1.类的修饰符分为:可访问控制符和非访问控制符两种. 可访问控制符是:公共类修饰符 public 非访问控制符有:抽象类修饰符 abstract :最终类修饰符 final 1 )公共类修饰符 pub ...
- 解决Git在更新项目时报凭证错误(Authentication failed)
报此错误,大概率原因是用户名和密码弄错了,我用的阿里云,在网上找了半天发现Git远程仓库用的用户名和密码不是阿里云登陆用的账户密码,必须另外设置: 链接:code.aliyun.com/profile ...
- storm trident的filter和函数
目的:通过kafka输出的信息进行过滤,添加指定的字段后,进行打印 SentenceSpout: package Trident; import java.util.HashMap; import j ...
- springMVC 与 struts+hibernate+spring优缺点
springMVC: Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术.Velocity.Tiles.iText 和POI.Spring M ...
- Android自定义view之仿微信录制视频按钮
本文章只写了个类似微信的录制视频的按钮,效果图如下: 一.主要的功能: 1.长按显示进度条,单击事件,录制完成回调 2.最大时间和最小时间控制 3.进度条宽度,颜色设置 二.实 ...
- 系统妈Win10系统64位和32位快速专业版
win10系统64位快速专业安装版 V2016年 系统妈:http://www.xitongma.com/ Ghost Win10 64位正式装机专业版2016 微软向Windows用户推送了win1 ...
- Django 表增加外键
1.创建临时表,并把原表的数据复制到临时表 先根据python manage syl article查看创建临时表 CREATE TABLE `article_article_temp` ( `id` ...
- strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用
strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切 @property (nonatomic, strong) NSString *stringA; @property ...
- FaceBook pop 动画开源框架使用教程说明
https://github.com/facebook/pop Pop is an extensible animation engine for iOS and OS X. In addition ...
- 第八篇:cx_Oracle出现的问题
1.cx_Oracle.DatabaseError: ORA-24315: illegal attribute type 2.cx_Oracle.InterfaceError: Unable to a ...