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 相关文章推荐
基于MooTools的很有创意的滚动条时钟动画
Nov 14 Javascript
seajs1.3.0源码解析之module依赖有序加载
Nov 07 Javascript
jquery checkbox实现单选小例
Nov 27 Javascript
浅析javascript中function 的 length 属性
May 27 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
Nov 09 Javascript
Bootstrap php制作动态分页标签
Dec 23 Javascript
JS和canvas实现俄罗斯方块
Mar 14 Javascript
详解ESLint在Vue中的使用小结
Oct 15 Javascript
angular6根据environments配置文件更改开发所需要的环境的方法
Mar 06 Javascript
axios+Vue实现上传文件显示进度功能
Apr 14 Javascript
详解JS实现系统登录页的登录和验证
Apr 29 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
Jul 22 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生成略缩图代码
2012/07/16 PHP
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
javascript 函数调用规则
2009/08/26 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
js的[defer]和[async]属性
2014/11/24 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
js判断鼠标位置是否在某个div中的方法
2016/02/26 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
[40:06]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第一场
2018/04/04 DOTA
Python脚本暴力破解栅栏密码
2015/10/19 Python
Python求出0~100以内的所有素数
2018/01/23 Python
python reverse反转部分数组的实例
2018/12/13 Python
python 实现批量替换文本中的某部分内容
2019/12/13 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
python time()的实例用法
2020/11/03 Python
澳大利亚票务和娱乐市场领导者:Ticketmaster
2017/03/03 全球购物
Linux文件系统类型
2012/02/15 面试题
英文求职信结束语大全
2013/10/26 职场文书
新娘父亲婚礼致辞
2014/01/16 职场文书
《云雀的心愿》教学反思
2014/02/25 职场文书
境外导游求职信
2014/02/27 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
python基础学习之递归函数知识总结
2021/05/26 Python
CSS Transition通过改变Height实现展开收起元素
2021/08/07 HTML / CSS
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android