在浏览器中改变地址栏url,将会触发页面资源的重新加载,这使得我们可以在不同的页面间进行跳转,得以浏览不同的内容。但随着单页应用的增多,越来越多的网站采用ajax来加载资源。因为异步加载的特性,地址栏上的资源路径没有被改变,随之而来的问题就是页面的状态无法被保存。这导致我们难以通过熟悉的方式(点击浏览器前进/后退按钮),在前后的页面状态间进行切换。

为了解决ajax页面状态不能返回的问题,人们想出了一些曲线救国的方法,比如利用浏览器hash的特性,将新的资源路径伪装成锚点,通过onhashchange事件来改变状态,同时又避免了浏览器刷新。但这样始终显得有些hack。

现在HTML5规范为 window.history引入了两个新api,pushState 和 replaceState,我们可以使用它很方便的达到改变url不重载页面的目的

——引用于https://blog.csdn.net/helloxiaoliang/article/details/73850428

location.hashlocation

当一个页面的(显示)状态被改变时,可以通过location.hash实现刷新页面后或者copy页面的URL再打开后保持状态而不还原。

当hash只有一个#时,location.hash返回空字符串;当hash不止一个#时,location.hash返回#以及#后面的部分。

当 一个window的 hash (URL 中 # 以及#后面的部分,可通过location.hash返回)改变时就会触发 hashchange 事件。

window.location属性返回一个有文档的当前位置的信息的Location对象。

语法:var oldLocation = location; location = newLocation;

无论什么时候,当一个新值被赋予location对象,一个文档将通过这个URL被加载,就像是location.assign()被这个URL调用了一样。

location.reload(true);:强制从服务器重新加载当前页面。

location.replace('http://example.com/#' + location.pathname);:将通过使用replace()方法插入location.pathname的值进hash来重新加载页面。注意,这replace()方法和字符串的replace()方法不是一个东西。

location.search = sData;:通过改变search属性来发送一个字符串数据给服务器。"?Some%20data"添加到当前的URL,然后URL被送到服务器(如果服务器没有采取动作,当前文档就用这个改变的search字符串重新加载)。

操纵浏览器历史

DOM window 对象通过 history 对象提供了对浏览器历史的访问。

window.history.back();:和用户点击浏览器回退按钮的效果相同。类似的还有window.history.forward();和window.history.go(Num);。另外,window.history.length; 可以获得历史堆栈中页面的数量。执行history.back()或history.forward()后会触发 window.onpopstate事件。

pushState()方法绝不会导致hashchange 事件被激活,就算新的URL和旧的只在hash上有区别。

history.pushState() 方法和history.replaceState()方法分别可以添加和改变历史实体。这两个方法要和window.onpopstate事件一起用。push和pop说明它们的行为就像栈。popstate事件会被触发当一个文档的激活的历史实体改变。如果激活的历史实体是由history.pushState()创建的,或者是被history.replaceState()改变过,那popstate事件的state属性(即e.state)会包含一个该激活的历史实体的sate对象的副本;如果不是,那e.state的值为null。调用history.pushState()方法和history.replaceState()方法不会触发popstate事件,the popstate event is only triggered by performing a browser action, such as clicking on the back button (or calling history.back() in JavaScript)。现在的浏览器加载页面时都不会触发popstate事件了(以前有的浏览器会)。

举个例子。history.pushState({ foo: "bar" }, "", "bar.html");会使地址栏的http://mozilla.org/foo.html变成http://mozilla.org/bar.html,但是不会使浏览器加载http://mozilla.org/bar.html,甚至都不会使浏览器检查http://mozilla.org/bar.html是否存在。假设用户在这个页面导航到了http://google.com,然后点击浏览器的回退按钮。这时,地址栏变成http://mozilla.org/bar.html,而且浏览器会加载http://mozilla.org/bar.html。如果这时你读取history.state,你会得到{ foo: "bar" }(即history.pushState()的第一个参数)。这时popstate事件不将被触发(?),因为页面是通过被加载而显示的(页面加载时触发的是load事件而不是popstate事件)。如果我们再点击回退按钮,才会回到http://mozilla.org/foo.html,这时文档会获得一个popstate事件(可以通过这个事件改变文档内容),且history.state是null。总之,history.pushState()会添加一个历史实体并激活它(也就是现在的页面变成新添加的历史实体了),但暂时还是显示原来的历史实体,只有当再次回到这个页面时(包括刷新,但是要注意刷新不会触发popstate事件哦,只有前进和后退会触发)才会显示新添加的历史实体。

history.pushState()接收三个参数,一个对象(用作state),一个字符串(用作标题,但是目前都被浏览器忽略),一个字符串(用作URL,是可选的):

·state会成为history.pushState()添加的历史实体的属性,可以用history.state获得。传入state的参数要能字符串化,比如能用JSON字符串化,因为火狐浏览器会把state这个对象存在用户的磁盘,以便当用户重启浏览器时state这个对象能恢复实际伤并不能恢复。state这个对象字符串化后的大小有限制(火狐是640K),如果需要更多的空间,你应该使用sessionStorage 和/或localStorage。

·第二个参数传入空的字符串即可。

·传入的URL可以是相对的也可以是绝对的。如果是相对的,它将相对于当前的URL被解析。传入的URL必须和当前的URL同源。如果不传入URL,则会被设置为当前的URL。

总之,调用pushState()和设置window.location = "#foo"(设置hash,与window.location.hash = "#foo"等效,且window.可省略)很像,两者都创建了并激活了一个新的历史实体。但是前者由以下优点:

1.         新的URL可以是任何和当前URL同源的URL,而设置window.location让你智能呆在同一个文档里,因为你只改变了hash。

2.         你可以不改变URL而创建新的历史实体,而通过设置window.location = "#foo";创建一个新的历史实体则必须要求当前的hash不是#foo。

3.         你可以在state中放入任何数据,而用hash就只能在URL末尾放入短字符串形式的数据。

history.replaceState()和history.pushState()很像,除了是改变当前的历史实体而不是创建一个新的。当你像更新当前的历史实体的state对象或URL来响应用户的行为时,replaceState()相当有用。

学习笔记:location.hash和history.pushState()的更多相关文章

  1. Redis学习笔记(3)-Hash

    package cn.com; import java.util.HashMap; import java.util.List; import java.util.Map; import java.u ...

  2. JAVA学习笔记--初探hash与map

    先推荐一篇文章 http://blog.csdn.net/cownew/article/details/6478993 也为自己mark

  3. 学习笔记-vue hash模式打包

    1.打包设置config->index.js 2.图片资源路径出现问题 设置下utils.js文件

  4. hash和history

    location.hash="aaa" history.pushState({},'', "home") history.replaceState() hist ...

  5. NodeJS学习笔记 进阶 (12)Nodejs进阶:crypto模块之理论篇

    个人总结:读完这篇文章需要30分钟,这篇文章讲解了使用Node处理加密算法的基础. 摘选自网络 Nodejs进阶:crypto模块之理论篇 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速 ...

  6. HTML5学习笔记之History API

    这系列文章主要是学习Html5相关的知识点,以学习API知识点为入口,由浅入深的引入实例,让大家一步一步的体会"h5"能够做什么,以及在实际项目中如何去合理的运用达到使用自如,完美 ...

  7. angular学习笔记(三十一)-$location(2)

    之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍 ...

  8. AngularJs学习笔记--Using $location

    原版地址:http://code.angularjs.org/1.0.2/docs/guide/dev_guide.services.$location 一.What does it do? $loc ...

  9. angular学习笔记(三十一)-$location(1)

    本篇介绍angular中的$location服务的基本用法,下一篇介绍它的复杂的用法. $location服务的主要作用是用于获取当前url以及改变当前的url,并且存入历史记录. 一. 获取url的 ...

随机推荐

  1. ubuntu安装配置ApachePhpMysql

    1.安装之前先sudo源 sudo apt update 2.安装Apache2 sudo apt install apache2 3.更改默认目录: vi /etc/apache2/apache2. ...

  2. 使用 Node.js 实现简单的 Webhook

    距离 Node.js 这个东西出来已经过了好久了,感觉现在的前端如果不会点 Node.js 就有点太落后于时代啦.我接触它是从去年暑假开始的,当时在写一个比较神奇的东西,就顺便接触了一下.虽然网传 n ...

  3. 审美赛_(java)实现

    问题描述 <审美的历程>课上有n位学生,帅老师展示了m幅画,其中有些是梵高的作品,另外的都出自五岁小朋友之手.老师请同学们分辨哪些画的作者是梵高,但是老师自己并没有答案,因为这些画看上去都 ...

  4. 前端编码规范 -- css篇

    合理的避免使用ID 一般情况下ID不应该被应用于样式. ID的样式不能被复用并且每个页面中你只能使用一次ID. 使用ID唯一有效的是确定网页或整个站点中的位置. 尽管如此,你应该始终考虑使用class ...

  5. CAS客户端整合(四)-- Cacti

    Cacti 是一套纯 lnmp 搭建的服务器监控系统,用 SNMP 抓取数据,RRDTool 绘制表格 登录流程 Cacti 的登录同样是先判断session,再尝试从 cookie 读取 sessi ...

  6. 《OD学spark》20160924scala基础

    拓展: Hadoop 3.0 NameNode HA NameNode是Active NameNode是Standby可以有多个 HBase Cluster 单节点故障? HBaster -> ...

  7. MCP|LQD|Data-independent acquisition improves quantitative cross-linking mass spectrometry (DIA方法可提升交联质谱定量分析)

    文献名:Data-independent acquisition improves quantitative cross-linking mass spectrometry (DIA方法可提升定量交联 ...

  8. jquery封装多棵并列树

    起因:当前的树都是在一棵树上,应产品需求,现在需要将一级菜单并列开,然后往下铺,这样只好自己写了. demo图: 我直接封在了jquery上,此外还加了获取勾选数据的一些简单API. 思路:先把一级菜 ...

  9. UVA307 Sticks

    题意:一组等长的木棒,将它们随机的砍掉,得到若干根小木棍, 每一节小棍的长度都不超过50个单位.然后想把这些木棍拼接起来,恢复到裁剪前的状态, 但忘记了初始时有多少木棒以及木棒的初始长度.计算木棒的可 ...

  10. 帝都Day3——各种dp

    备注:Day1 Day2记得笔记太233,所以就不发了 备注2:Day4~Day7发不发看心情qaq (7.17持续更新中...) 动态规划A 记忆化搜索 & 动态规划初步 8点15: 杨姓d ...