vue-微信浏览器左上角返回按钮拦截

摘要:
在微信公众号的开发中,有时需要截取浏览器左上角的返回按钮来处理相关页面逻辑,而不是让页面直接返回到上一页。此前,这一细节尚未得到很好的实施。微信左上角的返回按钮无法被拦截,但返回事件可以被监控。Popstate可能是微信内置的方法,无法删除。

【需求】

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

    vue-微信浏览器左上角返回按钮拦截第1张

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

【前提】

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

【思路】

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

【实现】

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

    vue-微信浏览器左上角返回按钮拦截第2张

【相关代码讲解】

  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-微信浏览器左上角返回按钮拦截》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android筆記前端规范2-CSS规范下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

通过props设置vue子组件的显示与隐藏

  最近项目在使用antd组件库做项目,页面中大量使用了a-modal弹窗.但是由于a-modal不能满足实际项目中的结构需要.为了方便复用,所以需要围绕a-modal进行二次封装.由此便引发了'如何通过props设置vue子组件的显示与隐藏'.其实主要问题是vue本身为了保证单向数据流,所以在子组件内部不能直接修改props.   1.1父组件代码   ...

vue中获取客户端IP地址

vue中获取客户端IP地址 获取ip方法 export functiongetUserIP(onNewIP) { let MyPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection ||window.webkitRTCPeerConnection; let...

VScode设置vue文件中保存自动格式化代码以及settings.json文件的配置。

最近在做vue 项目中,由于安装有代码检测工具ESlint,每次写完代码后就发现很多语法警告,查找配置好多也有许些小问题,现记录一份settings.json配置文件。 1、设置如下:  2、settings.json文件配置如下: { // vscode默认启用了根据文件类型自动设置tabsize的选项 "editor.detectIndent...

vue之templete模板

1.templete里要用data里的数据的话,不要加this. 2.按理说Js是写在<script></script>标签体内的。但是Vue的templete模板中对所有的数据绑定,都提供了完全的js支持。 代码示例如下: 强调"tableData.slice((currentPage-1)*pageSize,currentPag...

2/3 初次搭建 Vue 项目遇到的问题汇总

  今天步子扯开的有点大   初步看了一下 Vue-router 然后就开始用脚手架 Vue-cli 来搭建第一个项目了   遇到的问题确实很多,还有一些疑问,自己查资料都大致解决了一部分   ( 推荐还是理解了一部分的有缘人 进行阅读理解 如果有错 请大家指正 )   按照流水账来说一下 首先是 Vue-router    这里先简单谈一下,我的理解  ...

原有vue项目接入typescript

原有vue项目接入typescript 为什么要接入typescript javascript由于自身的弱类型,使用起来非常灵活。 这也就为大型项目、多人协作开发埋下了很多隐患。如果是自己的私有业务倒无所谓,主要是对外接口和公共方法,对接起来非常头疼。主要表现在几方面: 参数类型没有校验,怎么传都有,有时会出现一些由于类型转换带来的未知问题。 接口文档不...