浏览器内 popState 监听器使用

在前端开发过程中,在一些业务场景中可能会遇到监听浏览器前进/后退、控制路由等情况。我们可以使用Web API提供的popState事件来处理这些情况,提到popState,应用中,通常pushState配合使用。

popState

Usage

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

当活动历史记录条目更改时,将触发popstate事件。如果被激活的历史记录条目是通过对history.pushState()的调用创建的,或者受到对history.replaceState()的调用的影响,popstate事件的state属性包含历史条目的状态对象的副本。
需要注意的是调用history.pushState()或history.replaceState()不会触发popstate事件。只有在做出浏览器动作时,才会触发该事件,如用户点击浏览器的回退按钮(或者在Javascript代码中调用history.back()或者history.forward()方法)
不同的浏览器在加载页面时处理popstate事件的形式存在差异。页面加载时Chrome和Safari通常会触发(emit )popstate事件,但Firefox则不会。

pushState

Usage

history.pushState(state, title[, url])

参数

state

状态对象是一个JavaScript对象,它与由创建的新历史记录条目相关联 pushState()。每当用户导航到新状态时,popstate 就会触发一个事件,并且state 该事件的 属性包含历史记录条目的状态对象的副本。

状态对象可以是任何可以序列化的对象。因为Firefox将状态对象保存到用户的磁盘上,以便用户重新启动浏览器后可以将其还原,所以我们对状态对象的序列化表示施加了640k个字符的大小限制。如果将序列化表示形式大于此值的状态对象传递给 pushState(),则该方法将引发异常。如果您需要更多空间,建议您使用sessionStorage 或 localStorage。

title

当前大多数浏览器都忽略此参数,尽管将来可能会使用它。在此处传递空字符串应该可以防止将来对方法的更改。或者,您可以为要移动的州传递简短的标题。

url 可选的

新历史记录条目的URL由此参数指定。请注意,浏览器不会在调用之后尝试加载该URL pushState(),但是可能会稍后尝试加载该URL,例如,在用户重新启动浏览器之后。新的URL不必是绝对的。如果是相对的,则相对于当前URL进行解析。新网址必须与当前网址具有相同的来源;否则, pushState() 将引发异常。如果未指定此参数,则将其设置为文档的当前URL。

pushState类似于插入了一条新的历史记录,当用户返回时,只会返回到插入之前的url,再次点击返回才会回到原先的页面。调用次数和返回次数相关。popState用来监听历史记录变化。通过调用pushState方法,可以实现阻止浏览器立即返回上一页、自定义返回事件等。

实际案例

下面是几种遇到的场景,欢迎大家补充!

  1. 用户触发后退时,阻止浏览器立即返回。

    const state = {title: 'title',url: location.hash,
    };window.history.pushState(state, 'detail', location.hash);
    
  2. 当页面中出现弹窗、全屏组件等情况,尤其是在移动端h5页面,当用户需要关闭弹窗、取消全屏组件时,可能会使用物理返回键,这时会直接返回上一页面,而不是关闭弹窗。

    // 在React框架中的示例
    componentDidMount() {const state = {title: 'title',url: location.hash,};if (!window.history.state) {window.history.pushState(state, 'detail', location.hash);}window.addEventListener('popstate', this.popStateHandler, false);
    }componentWillUnmount() {console.log('componentWillUnmount');window.removeEventListener('popstate', this.popStateHandler, false);
    }popStateHandler = (state) => {// 有弹窗时返回事件处理console.log(state);const { showModal } = this.state;const { currentTarget = {} } = state;const { location: { hash } } = currentTarget;if (showModal) {this.setState({showModal: false, // 关闭弹窗});const s = {title: 'title',url: location.hash,};// 因为可能会出现多次弹窗,所以再次pushStatewindow.history.pushState(s, 'detail', location.hash);} else if (hash.indexOf('detail') !== -1) {// 无弹窗时直接返回上一页面,调用一次goBack();// 这里通过hash对比currentTarget是否是当前页面,不进行判断直接返回会造成返回两次!!!history.goBack();}
    }
    
  3. 单独维护当前页面,当页面可能跳转至下一页面时,返回该页面时不再调用pushState

    const state = {title: 'title',url: location.hash,
    };if (!window.history.state) {// 做一个是否已经pushState的判断,没有pushState才调用,history.state即pushState的第一个参数window.history.pushState(state, 'detail', location.hash);
    }
    

Created: Jul 30, 2020 10:48 AM
Author: Liquorxm
Tags: history, popstate, pushState, router, React, frontend

popState 监听浏览器切换路由相关推荐

  1. 【不得不看的几种js监听浏览器返回,关闭,刷新】

    监听浏览器切换页面 //切换页面document.addEventListener('visibilitychange', function () { //浏览器切换事件if (document.vi ...

  2. linux输入数字切换浏览器tab,js监听浏览器tab窗口切换

    js监听浏览器tab窗口切换 --IT唐伯虎 摘要:js监听浏览器tab窗口切换. if (document.hidden !== undefined) { document.addEventList ...

  3. vue监听浏览器tab切换

    vue监听浏览器tab切换 描述 监听tab切换浏览器页面,在离开当前页面和再次进来发生事件监听,类似与小程序的show函数 visibilitychange 详解 解决 created() {doc ...

  4. vue监听浏览器刷新和关闭事件,并在页面关闭/刷新前发送请求

    vue监听浏览器刷新和关闭事件,并在页面关闭/刷新前发送请求 1.需求背景: 2.需求分析: 3.实现方式: 4.实现方式解析: 1)浏览器页面事件基础 2)在mounted监听beforeunloa ...

  5. Vue监听浏览器前进后退物理返回键(浏览器自带的)

    Vue监听浏览器前进后退物理返回键 在某些需求下要监听用户物理按键. popstate事件只会在页面不跳转的情况下,路由发生变化触发. created() { // 创建vm实例后执行// 浏览器控制 ...

  6. html5 浏览器退回事件,html5的pushstate以及监听浏览器返回事件的实现

    这篇文章主要介绍了html5的pushstate以及监听浏览器返回事件的实现,主要介绍了pushstate的使用,以及监听浏览器的解决等问题,感兴趣的可以一起来了解一下 pushstate与监听浏览器 ...

  7. 监听浏览器的返回事件,禁止浏览器返回

    //禁止页面后退 history.pushState(null,null,document.URL); window.addEventListener('popstate',function(){// ...

  8. 【webview】微信和PC监听浏览器关闭和刷新(亲测可用)

    监听浏览器关闭和刷新 前言 PC端 微信端 前言 最近做的项目里有一个新的需求,在不同的浏览器内打开的网页,监听用户的操作,比如关闭浏览器,刷新浏览器等等. 这就涉及到了几个平台:PC端浏览器,移动端 ...

  9. js监听浏览器返回、后退、上一页按钮事件方法

    一.监听浏览器事件 ⼤家知道在页⾯中我们可以使⽤javascript window history,后退到前⾯页⾯,但是由于安全原因javascript不允许修改history ⾥已有的url链接,但 ...

最新文章

  1. python基础训练题2-元组,字典
  2. MySQL-BETWEEN AND范围查询问题
  3. ceph pool 管理(基础操作)
  4. endnotex7怎么导入中文文献_EndNote X7自动导入PDF功能详解 | 科研动力
  5. 阿里巴巴计算平台资深技术专家“一浪”对大数据领域近几年的技术趋势和变化的看法【强烈推荐数据岗细细品!】
  6. 如何用spring boot写一个注册页面
  7. Unity打包失败解决方案
  8. php中引入jquery文件_WP模板开发中,怎样给wordpress网站的文章,添加点赞功能?...
  9. linux下,查找命令的使用
  10. sql oltp_内存中的OLTP系列– SQL Server 2014上的数据迁移指南过程
  11. html文件一打开就未响应,我的电脑里的文件一右击就未响应是什么状况 求解决...
  12. 免费PDF阅读器都是坑?这些开源神器我可是恨不得所有人都知道
  13. 计算机组成原理平均cpi怎么算_计算机组成原理-计算机的性能指标及计算题
  14. https://juejin.im/entry/559f1d31e4b0876bf61e4d20
  15. ever 逾期_4ever的完整形式是什么?
  16. 微信小程序canvas绘制圆形头像
  17. 骆驼命名法,帕斯卡命名法与下划线命名法
  18. Webrtc 多人视频会议系统 服务器 Licode 介绍
  19. 扇贝编程python学习笔记-基础篇5
  20. 【论文翻译_无数据知识蒸馏_元学习_2022】Up to 100× Faster Data-free Knowledge Distillation

热门文章

  1. java 清空scanner_Java Scanner reset()用法及代码示例
  2. 学习笔记04(java多人聊天室)
  3. 机器学习大作业《Kaggle赛题之Kannada MNIST研究》论文和Python代码
  4. 幼儿园去“小学化”方法途径研究开题报告
  5. 宽带换了新的账号怎么连接服务器地址,换宽带了路由器怎么用手机重新设置方法【图】...
  6. Docker安装Nginx教程步骤
  7. Java foreach语句的用法
  8. K8S安装Jumpserver
  9. 自定义小程序popupwindow弹出框
  10. 观点 | 以太坊的黄金时代