【WeChat】Vue监听微信内置浏览器关闭事件


监听浏览器以及微信浏览器关闭、刷新事件

    需要注意
    发送数据请求需要使用ajax 同步模式async:false;axios为异步请求 个人测试使用async/await无效(ps:如果有axios的解决方案希望可以指教...)

关闭事件调试接口暂时发现需要避免谷歌、以及微信开发者工具 请求会失败debugger发现关闭之后进入了error 报错原因是跨域。

进入时间有两种处理方式
  1刷新页面不重置停留时间 这种情况需要存session拿到第一次打开页面的进入时间
  2.刷新页面 重置停留时间 这种情况直接获取进入时间 关闭页面时获取关闭时的时间

<template>
    <div class="home">
        <p>{{title}}</p>
        {{reqText}}
    </div>
</template>

<script>
    // @ is an alias to /src
    import $ from 'jquery'

    export default {
        name: 'Home',
        data() {
            return {
                title: localStorage.getItem('ua'),
                beforeUnloadTime: '',
                reqText: localStorage.getItem('req'),
                gapTime:''
            }
        },
        created() {
        },
        mounted() {
            // 判断是否是微信浏览器
            let ua = window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i)
            ua = ua !== null ? ua[0] : null;
            console.log(ua)
            if (ua === "micromessenger") {
                window.addEventListener('pagehide', e => this.beforeunloadHandler(e))
                window.addEventListener('unload', e => this.unloadHandler(e))
            } else {
                // 监听普通页面离开事件
                window.addEventListener('beforeunload', e => this.beforeunloadHandler(e))
                window.addEventListener('unload', e => this.unloadHandler(e))
            }
        },
        destroyed() {

       // 销毁监听的关闭事件
            window.removeEventListener('beforeunload', e => this.beforeunloadHandler(e))
            window.removeEventListener('pagehide', e => this.beforeunloadHandler(e))
            window.removeEventListener('unload', e => this.unloadHandler(e))
        },
        methods: {
         timeDate(){
           //处理进入事件,停留时间,离开时间的函数
         },
            beforeunloadHandler(e) {
                console.log(e);
                this.beforeUnloadTime = new Date().getTime();
            },
            unloadHandler(e) {
                // 这里调用时间函数确保记录时间的准确性
                this.timeDate()
                console.log(e);
                this.gapTime = new Date().getTime() - this.beforeUnloadTime;
                //判断是窗口关闭还是刷新
                if (this.gapTime <= 5) {
                    localStorage.setItem('ua','true')
                    $.ajax({
                        url: '/api/demo',
                        type: 'get',
                        async: false, //或false,是否异步
                        success: function (res) {
                            console.log(res)
                            localStorage.setItem('reqs', JSON.stringify(res))
                        },
                        error:function (res) {
                            console.log(res)
                            localStorage.setItem('reqs', JSON.stringify(res))
                        }
                    })
                }
            }
        }
    }
</script>

vue.config.js

module.exports = {
    devServer: {
   // mock 假数据 模拟真实的接口请求 这里是webpack内置的express
        before: app => {
            app.get("/api/demo", (req, res) => {
                res.json({
                    title: 'name'
                })
            })
        }
    }
}

补充关于vue注销监听事件的写法  上面的写法会出现路由跳转后其他页面也会有关闭监听的情况



    //添加beforeunload监听事件
        createBeforeunloadHandler() {
            //window.addEventListener('beforeunload', e => this.beforeunloadHandler(e));
            window.addEventListener('beforeunload', this.beforeunloadHandler, false);
        },
        //移除beforeunload事件
        destroyedBeforeunloadHandler() {
            //window.removeEventListener('beforeunload', e => this.beforeunloadHandler(e));//错误方法,无法移除
            window.removeEventListener('beforeunload', this.beforeunloadHandler, false);
            //this.rowEditEnable = 0;
        },
        //beforeunload监听事件
        beforeunloadHandler(e) {
                e.returnValue = "确定要关闭窗口吗?";
                console.log("释放权限操作");
                //释放权限操作,无阻塞
                //用户点击取消后执行,恢复操作
                setTimeout(function () {
                         setTimeout(function () {
                    console.log("恢复用户权限操作");
                  }, 50)
                }, 50);
        },
     },
     beforeDestroy() {
        //在 beforeDestroy 钩子移除beforeunload事件
        this.destroyedBeforeunloadHandler();
     },

声明:麋鹿与鲸鱼|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 【WeChat】Vue监听微信内置浏览器关闭事件


Carpe Diem and Do what I like