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协议都是我们最常打交 ...
随机推荐
- CF1072B Curiosity Has No Limits
思路: 对于序列t,只要第一个数确定了,后续的数也随之确定了.枚举四种情况即可.实现: #include <iostream> #include <vector> using ...
- TP框架设置验证码
thinkphp框架有专门的的验证码生成的模块 public function shengcheng(){ $n = new \Think\Verify(); $n->entry(); } 下面 ...
- 实训随笔:EL表达式JSON应用
由于之前在学校写的jsp页面都是夹杂着java代码的,所以之前写了个jsp,满满的<%%>和java代码,老师说那样太不美观了啊!!!要全部用EL表达式替代了.本人还是太笨了,弄了一上午才 ...
- Selenium私房菜系列7 -- 玩转Selenium Server
本篇主要是想更进一步介绍Selenium Server的工作原理,这次我们从Selenium Server的交互模式开始. 在<第一个Selenium RC测试案例>中,我们以命令“jav ...
- eclipse报错MA
今天有个总监晒了张tomcat7.0崩溃忘记怎么搞了,大家都在吐槽"一个[总监](经常水群)竟然不会这个".敲上来. Problem Occurred系列: 'Starting T ...
- 程序windows上可以上传附件,部署到 linux服务器后出现 “上传目录 不可写” 怎么解决?
这样的问题一般都是linux 下文件读写权限引起的,用 shell 命名到上传附件的目录(如 cd /data/www/project/upload/),然后执行 shell 文件权限设置: 例如 ...
- HtmlUnit爬取Ajax动态生成的网页以及自动调用页面javascript函数
HtmlUnit官网的介绍: HtmlUnit是一款基于Java的没有图形界面的浏览器程序.它模仿HTML document并且提供API让开发人员像是在一个正常的浏览器上操作一样,获取网页内容,填充 ...
- "Mac OS X"录屏幕视频并转成gif
第一步: 使用软件QuickTime Player录屏幕视频,创建方式选择新建屏幕录制: 选择区域录制,录好保存后,就需要转gif,需要另外一个软件. 第二步: 使用GIFBrewery软件创建gif ...
- shell 复合条件测试 if [ $1 == "1" -o $1 == "0" ] ------==和-eq怎么用
想要实现: ”,或者$1等于“” ];then 输出一些东西 ”,或者$1等于“” ];then 输出一些东西 fi 这里比较难操作的是等于和或者: 等于: -eq 或者 == 或者: -o 见: ...
- keras中的shape/input_shape
在keras中,数据是以张量的形式表示的,张量的形状称之为shape,表示从最外层向量逐步到达最底层向量的降维解包过程.“维”的也叫“阶”,形状指的是维度数和每维的大小.比如,一个一阶的张量[1,2, ...