锚接口(下)——html5的history api
概述
虽然html5的history api是H5专门用来解决记录历史记录和单页面的方法,但是很多老式的浏览器并不支持它,所以一般遇到老式的浏览器会做一个polyfill使用之前的hashchange方法。
另一方面,html5的history api在实际使用的时候会和之前的hashchange方法的用法有稍微的不同。
说明
- 主要使用history.pushState改变url,它的调用格式是
history.pushState(data, title, path);,其中data是一个自己定义的数据对象,title是标题,现在大部分浏览器还不支持,path是路径。 - 用这个方法改变url的时候,页面并不刷新。
- 用这个方法改变url的时候,并不会触发onpopstate事件,只有在使用history.go或者history.back等方法的时候才会触发onpopstate事件,比如说浏览器按倒退键。(这一点和hashchange方法不同)
- 触发onpopstate事件的时候可以用event.state获得data这个对象。
解决方案
SPA怎么路由
具体和hashchange方法类似,唯一不同的地方是,在用history.pushState改变url的时候,由于不会触发onpopstate事件,所以一些函数要放在history.pushState改变url之后处理(以前是直接由hashchange事件处理)。
复制url并在另一个页面打开
如果是用#符号的话,那么方法类似hashchange。
但是新的history api可以摒弃#字符,比如说react-router里面就是这么做的,具体怎么解决我还没有弄清楚。
例子
下面是我编写的一段测试代码供大家参考。直接复制并存为html文件,然后在服务器上打开即可。(因为history api需要一个域名,可以是locahost)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script type="text/javascript">
//hashchange事件,如果有hash值,则输出到oDiv。
function onPopstate(event) {
if(history.state) {
console.log(history.state.next);
}
if(history.state && history.state.next === 1){
$('#div1').hide();
$('#div2').show();
$('#div3').hide();
} else if(history.state && history.state.next === 2) {
$('#div1').hide();
$('#div2').hide();
$('#div3').show();
} else {
$('#div1').show();
$('#div2').hide();
$('#div3').hide();
}
}
//页面加载
window.onload=function (){
//加载时触发一次hashchange事件
$(window)
.bind( 'popstate', onPopstate )
.trigger( 'popstate' );
//点击事件,把数组装在hash里面
document.getElementById("input1").onclick=function(){
history.pushState({next: 1}, null, 'next1.html');
$('#div1').hide();
$('#div2').show();
$('#div3').hide();
};
document.getElementById("input2").onclick=function(){
history.pushState({next: 2}, null, 'next2.html');
$('#div1').hide();
$('#div2').hide();
$('#div3').show();
};
document.getElementById("input3").onclick=function(){
history.pushState('', null, 'index.html');
$('#div1').show();
$('#div2').hide();
$('#div3').hide();
};
}
</script>
</head>
<body>
主页=模块1,模块2页=模块2,模块3页=模块3
<input type="button" value="去模块2页" id="input1" />
<input type="button" value="去模块3页" id="input2" />
<input type="button" value="去主页" id="input3" />
<div id="div1">模块111111111111111111</div>
<div id="div2">模块222222222222222222</div>
<div id="div3">模块333333333333333333</div>
</body>
</html>
其它
- 单页面路由实际上和我的demo不一样,不太运用history.pushState里面的data参数,而是直接分析url做正则匹配,不过这个data参数在别的地方有很大用处。
- 一般的路由和我的demo里面不一样,不是用按钮而是用a链接,那个时候直接在click的时候阻止默认跳转即可。
- history.pushState里面的data参数储存在sessionStorage里面。
锚接口(下)——html5的history api的更多相关文章
- 使用HTML5的History API
HTML5 History API提供了一种功能,能让开发人员在不刷新整个页面的情况下修改站点的URL.这个功能很有用,例如通过一段JavaScript代码局部加载页面的内容,你希望通过改变当前页面的 ...
- 利用HTML5的History API实现无刷新跳转页面初探
HTML4中的History API history这个东西大家应该都不陌生,我们经常使用history.back(-1)来实现后退功能,具体的属性和方法如下: 属性 length 历史的项数.Jav ...
- 有关html5的history api
从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残按到了F5.然后,页面刷新了,评论又回到了第一页 ...
- 锚接口(上)——hashchange api 和 $.uriAnchor
概述 这是我在单页Web应用这本书上看到的方法,并深入的研究了一下,把结果记录在下面,供以后开发时参考,相信对其它人也有用. 说明一下,这个方法已经过时了,H5有更新的方法:history api,我 ...
- Html5 history Api简介
一. Html4的History API back() 后退,跟按下“后退”键是等效的. forward() 前进,跟按下“前进”键是等效的. go() 用法:history.go(x):在历史的范围 ...
- HTML5 History API让ajax能回退到上一页
HTML5 History API提供了一种功能,能让开发人员在不刷新整个页面的情况下修改站点的URL.这个功能很有用,例如通过一段JavaScript代码局部加载页面的内容,你希望通过改变当前页面的 ...
- window.history的跳转实质-HTML5 history API 解析
在上一浏览器跳转行为的测试中,我们看到了通过不同的方法操作浏览器跳转时,它的刷新表现有所不同,在这一文章中,将看看,为何会产生这样的不同?其背后的实质是什么?浏览器的访问历史记录到底是如何运作的呢? ...
- 林大妈的JavaScript进阶知识(三):HTML5 History API
HTML5中新增了History API,它用于管理浏览器路由跳转的一个url栈.History是window对象的一部分,它也是一个对象,因此称它是BOM(类似DOM,Browser Object ...
- 学习HTML5 history API
html5 在 history 对象上添加几个新的方法.事件.属性,用以增强开发者对于浏览器历史记录的控制.大体上说,新的API可以帮助我们在无刷新的情况下改变浏览器的url,新增或者替换之前的历史记 ...
随机推荐
- docker报错
用docker搭建环境时可能会遇到错误:No releases available for package "xxxx" No releases available for pac ...
- Fastjson 实体类JSON化过滤字段操作-PropertyFilter
过滤实体类中年龄等于5的字段 List<Users> models=new ArrayList<>(); for(int i=0;i<11;i++){ Users mod ...
- Linux 子网掩码计算, 二进制十进制互相转换
看下边例子 192.168.0.1/24 192.168.0.1/32 192.168.0.1/28 上边24,32,28对应的掩码都是什么,怎么计算的 24,32,28,对应的就是多少个二进制的1 ...
- 深度学习项目——基于卷积神经网络(CNN)的人脸在线识别系统
基于卷积神经网络(CNN)的人脸在线识别系统 本设计研究人脸识别技术,基于卷积神经网络构建了一套人脸在线检测识别系统,系统将由以下几个部分构成: 制作人脸数据集.CNN神经网络模型训练.人脸检测.人脸 ...
- 11. Container With Most Water (JAVA)
Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). ...
- python note 07 集合
1.删除特例 lis = [11,22,33,44,55] for i in range(len(lis)): print(i) del lis[i] print(lis) #每删除链表中一个值链表就 ...
- 31. Next Permutation 返回下一个pumutation序列
[抄题]: Implement next permutation, which rearranges numbers into the lexicographically next greater p ...
- react项目搭建
1.下载安装node.js,需要node.js环境. 2.经过挑选,决定选择creat-react-app这个项目脚手架,然后输入指令安装 $ npm install -g crea ...
- ramfs的两种制作方法
制作方法1 1 准备一个已经可以使用的文件系统,假设目录为/rootfsLinux内核需要支持ext2文件系统及ramdisk支持(fs相应的选项要勾上)2 在pc上制作ramdisk镜像(1)dd ...
- [IBM][CLI Driver] SQL0270N 函数不受支持(原因码:"75")。 SQLSTATE=42997
db2 update dbm cfg using FEDERATED yes 与 自动维护 (AUTO_MAINT) = ON 自动数据库备份 (AUTO_DB_BACKUP) = OFF 自动表 ...