不刷新网页修改url连接:history.pushState()和history.replaceState()新增、修改历史记录用法介绍

  最近遇到了在不刷新页面的状况下修改浏览器url连接的需求,考虑到能够经过history.pushState()解决。如今将我理解的一些内容分享一下,不对的地方欢迎你们指出。浏览器

  在使用方法前首先须要了解它的兼容性,history.pushState()存在必定的兼容性问题,能够经过 https://caniuse.com/#search=pushState 查看支持的浏览器版本。安全

  history.pushState(stateObject, title, url);

  history.pushState()主要是在不刷新浏览器的状况下,建立新的浏览记录并插入浏览记录队列中。this

一、状态对象(stateObject)—— stateObject是一个JavaScript对象,经过pushState方法能够将stateObject内容传递到新页面中。url

二、标题(title)—— 几乎没有浏览器支持该参数,可是传一个空字符串会比较安全。spa

三、地址(url)—— 新的历史记录条目的地址(可选,不指定的话则为文档当前URL)。code

  浏览器在调用pushState()方法后不会加载该地址;传入的URL与当前URL应该是同源的,不然,pushState()会抛出异常。对象

window.history.replaceState({}, '', `?query=${this.query}`)

  上面代码就能够在不刷新网页的状况下,更新url连接了。blog

  而后抽空研究了下这两个新方法,确实能够解决不少问题队列

1、使用pushState()方法 能够控制浏览器自带的返回按钮事件

  有时候咱们想让用户点击浏览器返回按钮时,不返回,或执行其余操做,这时,就用到history.pushState()方法。

  history.pushState(data,title,url) ,每执行一次都会增长一条历史记录

  data:要设置的history.state的值,能够是任意类型的值,可根据此值进行判断执行想要的操做。

  好比监听浏览器的前进后退事件:

window.addEventListener("popstate", function() { // 取出 设置好的 history.state 值,作判断
});

2、history.replaceState() 与pushState()功能相似,除了这点:

  replaceState()是用来修改当前的历史记录(history实体),而不是建立一个新的历史记录,因此,当执行完history.replaceState()后,点击返回按钮照样会返回上一个页面。  当须要更新一个state对象或者当前history实体时,能够用replaceState()来实现。

  用法:当在a页面使用replaceState()修改了历史记录后,跳转到b页面,后退到a页面时,历史记录就是修改过的。