vue实现微信浏览器左上角返回按钮拦截功能


Posted in Javascript onJanuary 18, 2020

【需求】

在微信公众号开发中,有时需要对浏览器左上角返回按钮进行拦截处理相关的页面逻辑,而并不是让页面直接返回上一页,之前在这个细节点上的一直实现得不是很好。但看到京东购物公众号上的效果却实现得非常好,所以自己也开始了这方面的尝试。京东的效果如下图:

vue实现微信浏览器左上角返回按钮拦截功能

从上图京东购物效果上来看,在点击搜索拉起一个搜索界面,然后点击左上角反回,只是将搜索界面收起,而页面没有重新像读取进度条一样去返回,而我页面需要的正是这样的效果,下面就用vue来做一个这个过程的 demo 吧。

【前提】

微信左上角的返回按钮其实无法被拦截,但是可以监听到这个返回事件。

【思路】

要想真正拦截返回事件,可以当前页面先向 window.history 中添加一个记录(实际只是在历史记录堆栈中添加一条记录 pushState,浏览器并不会真正去加载这个路径),当点击返回时,监听到返回事件处理自己想处理的逻辑,反正微信它是一定要执行返回,刚添加的那条记录就会从 window.history 拿出并将此路径替换当前页面路径。注意:这里只是路径的替换,只是将路径换了个名字,并不是会真正去加载这个路径。

【实现】

demo 里建立了两个 vue 页面( first 和 two ),第一个页面跳转到到第二个页面。然后在第二个页面弹出一个蒙层,这时点击左上角返回时,并不是返回 first,而是先将蒙层消失,再次点击返回时才是返回上一页;实现效果如下:

vue实现微信浏览器左上角返回按钮拦截功能

【相关代码讲解】

1. 在第二个页面 mounted 方法中加入,添加监听返回事件方法。当返回按钮被点击时,这里让弹出的蒙层隐藏;

mounted() {
 let that = this;
 // 添加返回事件监听
 window.addEventListener("popstate", function(e) {
  that.isShowTestDiv = false;
 }, false);
 },

2. 监听蒙层,当它显示时,在window.history(历史堆栈)中添加一条记录;

watch: {
 isShowTestDiv: function(newVal, oldVal) {
  if (newVal === true) {
  this.pushHistory();
  }
 }
 }

 pushHistory() { // 修改history
  var state = {
  title: "",
  url: "/two" // 这个url可以随便填,只是为了不让浏览器显示的url地址发生变化,对页面其实无影响
  };
  window.history.pushState(state, state.title, state.url);
 },

3. 最后弹出的蒙层如果用户点蒙层上相关操作将蒙层关闭,那么要手动将自己添加的那条记录从 history 中移除,在 vue 中将路由 back 一下即可。

helloClick() { // 点击弹出来的hello蒙板
  this.isShowTestDiv = false;
  this.$router.back(); // 将添加记录从history中移除
 }

 【相关补充】

注意:window.addEventListener 添加的事件回调会一直存在,因为 Vue 实例销毁时,window 对象并不会销毁。可以在它的回调里打印,会发现在 two 之外的页面点返回也会进入它的方法。但因为 two 页面内对象数据都已销毁,所以进了此方法也无任何问题。如果不想让其进入,可以用存储一些全局变量加入 if 判断,在 two 页面 destroyed 等相关勾子函数将这个全局变量置成想要状态;或者在全局路由勾子方法中设置相关全局变量也可以。

之前有尝试在 two 的 destroyed 方法内,通过 window.removeEventListener 移除添加的方法,但发现无效果。可能 popstate 是微信内置方法,不能被移除。

【demo地址】

https://github.com/LiJinShi/wechat_back_vue

总结

以上所述是小编给大家介绍的vue实现微信浏览器左上角返回按钮拦截功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
JS操作select下拉框动态变动(创建/删除/获取)
Jun 02 Javascript
javascript实现原生ajax的几种方法介绍
Sep 21 Javascript
JS+CSS实现下拉列表框美化效果(3款)
Aug 15 Javascript
Javascript中的return作用及javascript return关键字用法详解
Nov 05 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
Dec 03 Javascript
JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)
Aug 11 Javascript
原生js实现放大镜特效
Mar 08 Javascript
详解Node.js中exports和module.exports的区别
Apr 19 Javascript
AngularJS基于factory创建自定义服务的方法详解
May 25 Javascript
详解Angular4中路由Router类的跳转navigate
Jun 09 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
Sep 23 jQuery
JavaScript前端面试组合函数
Jun 21 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
Jan 18 #Javascript
JS数组方法slice()用法实例分析
Jan 18 #Javascript
JS实现横向轮播图(中级版)
Jan 18 #Javascript
vue.js+ElementUI实现进度条提示密码强度效果
Jan 18 #Javascript
JS数组方法concat()用法实例分析
Jan 18 #Javascript
JS实现纵向轮播图(初级版)
Jan 18 #Javascript
JS数组方法reverse()用法实例分析
Jan 18 #Javascript
You might like
php中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
php+mysqli使用面向对象方式查询数据库实例
2015/01/29 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
Yii框架实现邮箱激活的方法【数字签名】
2016/10/18 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
jQuery 加上最后自己的验证
2009/11/04 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
jquery 设置元素相对于另一个元素的top值(实例代码)
2013/11/06 Javascript
javascript实现日期按月份加减
2015/05/15 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
js对象浅拷贝和深拷贝详解
2016/09/05 Javascript
RGB和YUV 多媒体编程基础详细介绍
2016/11/04 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
js实现点击按钮复制文本功能
2020/07/20 Javascript
React 组件间的通信示例
2018/06/14 Javascript
angular的输入和输出的使用方法
2018/09/22 Javascript
Vue.js组件通信之自定义事件详解
2019/10/19 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
使用Kivy将python程序打包为apk文件
2017/07/29 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
美国学校用品、教室和教学商店:Discount School Supply
2018/04/04 全球购物
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
2014/04/28 面试题
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
大学生心理健康活动总结
2015/05/08 职场文书
离婚起诉书怎么写
2015/05/19 职场文书
python生成随机数、随机字符、随机字符串
2021/04/06 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
python字典进行运算原理及实例分享
2021/08/02 Python
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android