Javascript学习笔记(history对象)

来源:互联网 发布:mac双系统win10黑屏 编辑:程序博客网 时间:2024/06/06 23:18

history对象

来自《JavaScript 标准参考教程(alpha)》,by 阮一峰

目录

  • 概述
  • history.pushState()
  • history.replaceState()
  • history.state属性
  • popstate 事件
  • URLSearchParams API
  • 参考链接

概述

浏览器窗口有一个history对象,用来保存浏览历史。

如果当前窗口先后访问了三个网址,那么history对象就包括三项,history.length属性等于3。

history.length // 3

history对象提供了一系列方法,允许在浏览历史之间移动。

  • back():移动到上一个访问页面,等同于浏览器的后退键。
  • forward():移动到下一个访问页面,等同于浏览器的前进键。
  • go():接受一个整数作为参数,移动到该整数指定的页面,比如go(1)相当于forward()go(-1)相当于back()
history.back();history.forward();history.go(-2);

如果移动的位置超出了访问历史的边界,以上三个方法并不报错,而是默默的失败。

history.go(0)相当于刷新当前页面。

history.go(0);

常见的“返回上一页”链接,代码如下。

document.getElementById('backLink').onclick = function () {  window.history.back();}

注意,返回上一页时,页面通常是从浏览器缓存之中加载,而不是重新要求服务器发送新的网页。

history.pushState()

HTML5为history对象添加了两个新方法,history.pushState()history.replaceState(),用来在浏览历史中添加和修改记录。

if (!!(window.history && history.pushState)){  // 支持History API} else {  // 不支持}

上面代码可以用来检查,当前浏览器是否支持History API。如果不支持的话,可以考虑使用Polyfill库History.js。

history.pushState方法接受三个参数,依次为:

  • state:一个与指定网址相关的状态对象,popstate事件触发时,该对象会传入回调函数。如果不需要这个对象,此处可以填null
  • title:新页面的标题,但是所有浏览器目前都忽略这个值,因此这里可以填null
  • url:新的网址,必须与当前页面处在同一个域。浏览器的地址栏将显示这个网址。

假定当前网址是example.com/1.html,我们使用pushState方法在浏览记录(history对象)中添加一个新记录。

var stateObj = { foo: 'bar' };history.pushState(stateObj, 'page 2', '2.html');

添加上面这个新记录后,浏览器地址栏立刻显示example.com/2.html,但并不会跳转到2.html,甚至也不会检查2.html是否存在,它只是成为浏览历史中的最新记录。这时,你在地址栏输入一个新的地址(比如访问google.com),然后点击了倒退按钮,页面的 URL 将显示2.html;你再点击一次倒退按钮,URL 将显示1.html

总之,pushState方法不会触发页面刷新,只是导致history对象发生变化,地址栏会有反应。

如果pushState的url参数,设置了一个新的锚点值(即hash),并不会触发hashchange事件。如果设置了一个跨域网址,则会报错。

// 报错history.pushState(null, null, 'https://twitter.com/hello');

上面代码中,pushState想要插入一个跨域的网址,导致报错。这样设计的目的是,防止恶意代码让用户以为他们是在另一个网站上。

history.replaceState()

history.replaceState方法的参数与pushState方法一模一样,区别是它修改浏览历史中当前纪录。

假定当前网页是example.com/example.html

history.pushState({page: 1}, 'title 1', '?page=1');history.pushState({page: 2}, 'title 2', '?page=2');history.replaceState({page: 3}, 'title 3', '?page=3');history.back()// url显示为http://example.com/example.html?page=1history.back()// url显示为http://example.com/example.htmlhistory.go(2)// url显示为http://example.com/example.html?page=3

history.state属性

history.state属性返回当前页面的state对象。

history.pushState({page: 1}, 'title 1', '?page=1');history.state// { page: 1 }

popstate 事件

每当同一个文档的浏览历史(即history对象)出现变化时,就会触发popstate事件。

需要注意的是,仅仅调用pushState方法或replaceState方法 ,并不会触发该事件,只有用户点击浏览器倒退按钮和前进按钮,或者使用 JavaScript 调用backforwardgo方法时才会触发。另外,该事件只针对同一个文档,如果浏览历史的切换,导致加载不同的文档,该事件也不会触发。

使用的时候,可以为popstate事件指定回调函数。

window.onpopstate = function (event) {  console.log('location: ' + document.location);  console.log('state: ' + JSON.stringify(event.state));};// 或者window.addEventListener('popstate', function(event) {  console.log('location: ' + document.location);  console.log('state: ' + JSON.stringify(event.state));});

回调函数的参数是一个event事件对象,它的state属性指向pushStatereplaceState方法为当前 URL 所提供的状态对象(即这两个方法的第一个参数)。上面代码中的event.state,就是通过pushStatereplaceState方法,为当前URL绑定的state对象。

这个state对象也可以直接通过history对象读取。

var currentState = history.state;

注意,页面第一次加载的时候,浏览器不会触发popstate事件。

URLSearchParams API

URLSearchParams API用于处理URL之中的查询字符串,即问号之后的部分。没有部署这个API的浏览器,可以用url-search-params这个垫片库。

var paramsString = 'q=URLUtils.searchParams&topic=api';var searchParams = new URLSearchParams(paramsString);

URLSearchParams有以下方法,用来操作某个参数。

  • has():返回一个布尔值,表示是否具有某个参数
  • get():返回指定参数的第一个值
  • getAll():返回一个数组,成员是指定参数的所有值
  • set():设置指定参数
  • delete():删除指定参数
  • append():在查询字符串之中,追加一个键值对
  • toString():返回整个查询字符串
var paramsString = 'q=URLUtils.searchParams&topic=api';var searchParams = new URLSearchParams(paramsString);searchParams.has('topic') // truesearchParams.get('topic') // "api"searchParams.getAll('topic') // ["api"]searchParams.get('foo') // null,注意Firefox返回空字符串searchParams.set('foo', 2);searchParams.get('foo') // 2searchParams.append('topic', 'webdev');searchParams.toString() // "q=URLUtils.searchParams&topic=api&foo=2&topic=webdev"searchParams.append('foo', 3);searchParams.getAll('foo') // [2, 3]searchParams.delete('topic');searchParams.toString() // "q=URLUtils.searchParams&foo=2&foo=3"

URLSearchParams还有三个方法,用来遍历所有参数。

  • keys():遍历所有参数名
  • values():遍历所有参数值
  • entries():遍历所有参数的键值对

上面三个方法返回的都是Iterator对象。

var searchParams = new URLSearchParams('key1=value1&key2=value2');for (var key of searchParams.keys()) {  console.log(key);}// key1// key2for (var value of searchParams.values()) {  console.log(value);}// value1// value2for (var pair of searchParams.entries()) {  console.log(pair[0]+ ', '+ pair[1]);}// key1, value1// key2, value2

在Chrome浏览器之中,URLSearchParams实例本身就是Iterator对象,与entries方法返回值相同。所以,可以写成下面的样子。

for (var p of searchParams) {  console.log(p);}

下面是一个替换当前URL的例子。

// URL: https://example.com?version=1.0var params = new URLSearchParams(location.search.slice(1));params.set('version', 2.0);window.history.replaceState({}, '', `${location.pathname}?${params}`);// URL: https://example.com?version=2.0

URLSearchParams实例可以当作POST数据发送,所有数据都会URL编码。

let params = new URLSearchParams();params.append('api_key', '1234567890');fetch('https://example.com/api', {  method: 'POST',  body: params}).then(...)

DOM的a元素节点的searchParams属性,就是一个URLSearchParams实例。

var a = document.createElement('a');a.href = 'https://example.com?filter=api';a.searchParams.get('filter') // "api"

URLSearchParams还可以与URL接口结合使用。

var url = new URL(location);var foo = url.searchParams.get('foo') || 'somedefault';
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鲁班上梁四言八句 农村上梁简单的吉利话 上梁四言八句大全 上梁不正下梁歪是什么意思 上梁吉言好词好句 上翻梁钢筋构造示意图 上梁不正by秦三见 连续梁 庄子与惠子游于濠梁之上 喜上眉梢 喜上心头爱上眉梢 喜上眉梢打一字 喜上眉梢图片 仓永梢 鱼竿梢绳怎么打结图 喜上眉梢图画大全 喜上眉梢的意思 闲妻手记 月上梅梢 喜上眉梢造句 禧上眉梢 不游泳小鱼 喜上眉梢图画 喜上眉梢的寓意 喜上眉梢国画 禧上眉梢免费全文阅读 技能请留步 柳梢月上 球棎比分足球即时比分 球棎网 棎棎交友 棎棎 上步南路 上步中学 同德上步花园 马桶上水 太阳能上水 热水器上水 上水 上水石 马桶不上水 马桶上水慢