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 相关文章推荐
关于jQuery object and DOM element
Apr 15 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
Jun 05 Javascript
javascript如何判断输入的url是否正确
Apr 11 Javascript
Javascript函数的参数
Jul 16 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
Mar 25 Javascript
JS常用加密编码与算法实例总结
Dec 22 Javascript
js设置文字颜色的方法示例
Dec 30 Javascript
highcharts 在angular中的使用示例代码
Sep 20 Javascript
Javascript中从学习bind到实现bind的过程
Jan 05 Javascript
vue多页面开发和打包正确处理方法
Apr 20 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
Oct 18 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
Jul 04 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通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
用PHP实现的四则运算表达式计算实现代码
2011/08/02 PHP
Yii中CGridView关联表搜索排序方法实例详解
2014/12/03 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
微信小程序实现tab页面切换功能
2018/07/13 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
微信小程序文字显示换行问题
2019/07/28 Javascript
Layui动态生成select下拉选择框不显示的解决方法
2019/09/24 Javascript
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python实现简单点对点(p2p)聊天
2017/09/13 Python
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
在CMD命令行中运行python脚本的方法
2018/05/12 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
实习生自我鉴定范文
2013/12/05 职场文书
《赶海》教学反思
2014/04/20 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
火烧圆明园的观后感
2015/06/03 职场文书
秋收起义观后感
2015/06/11 职场文书
公司开业主持词
2015/07/02 职场文书
子女赡养老人协议书
2016/03/23 职场文书
导游词之茶卡盐湖
2019/11/26 职场文书
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
2021/05/25 Vue.js
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server