【webview】微信和PC监听浏览器关闭和刷新(亲测可用)

简介: 最近做的项目里有一个新的需求,在不同的浏览器内打开的网页,监听用户的操作,比如关闭浏览器,刷新浏览器等等。这就涉及到了几个平台:PC端浏览器,移动端IOS和安卓微信的webview等等。在微信里打开的H5网页,要获取到用户关闭页面的事件。经过对visibilitychange、 unload/pagehide 、onunload、popstate各种方法一阵测试,发现安卓里`visibilitychange`能监听到关闭事件。而iOS里使用`pagehide`能监听。

前言

最近做的项目里有一个新的需求,在不同的浏览器内打开的网页,监听用户的操作,比如关闭浏览器,刷新浏览器等等。
这就涉及到了几个平台:PC端浏览器,移动端IOS和安卓微信的webview等等。在微信里打开的H5网页,要获取到用户关闭页面的事件。经过对visibilitychange、 unload/pagehide 、onunload、popstate各种方法一阵测试,发现安卓里visibilitychange能监听到关闭事件。而iOS里使用pagehide能监听。

PC端

pc端的浏览器,比如谷歌 chrome、IE、360等等,都没有直接特定的监听关闭或者刷新的方法。所以这里采用时间差,来判断用户是刷新还是关闭,亲测可用:

 //PC 端浏览器
 
    let _beforeUnload_time = 0,_unload_time = 0

    window.addEventListener('beforeunload', async ()=> {
        _beforeUnload_time = new Date().getTime()
    })

    window.addEventListener('unload', async () => {
        _unload_time = new Date().getTime()
        //计算时间差
        if (_unload_time - _beforeUnload_time <= 2) {
            //用户关闭了页面
            //此处关闭页面处理逻辑
            alert("用户关闭了页面")
            const data = await sendRequest({
                url: `/destory`,
                data: {gameId: gameId, userId: userid},
            });
        } else {
            //用户刷新了页面
            //此处刷新页面处理逻辑
            alert("用户刷新了页面")
            await checkEnqueue()
        }
    })

微信端

微信端为了考虑安全性,同样微信API也未给出一个特定的api接口调用,所以这里调用微信的第三方sdk:

1、引入微信sdk

<script src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>

2、判断是ios还是android

  var u = navigator.userAgent;
    var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
    var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端

3、对不同的平台分别做相应的处理:

  if (isAndroid) { //安卓
        if (window.addEventListener) {
            //安卓页面关闭
            document.addEventListener("visibilitychange", async function () { //部分手机可以获取到
                if (document.hidden) {
                //用户关闭了安卓页面
                //做关闭页面处理逻辑
                    await sendRequest({
                        url: `/destory`,
                        data: {gameId: gameId, userId: userid},
                    });
                }
            })
        } else if (window.attachEvent) {
            // 主要是为了兼容老的IE
            window.attachEvent('onpagehide', async function () {
                await sendRequest({
                    url: `/destory`,
                    data: {gameId: gameId, userId: userid},
                });
            })
        } else {
            window.onbeforeunload = async function () {
                await sendRequest({
                    url: `/destory`,
                    data: {gameId: gameId, userId: userid},
                });
            }
        }
    } else if (isiOS){ //苹果
        window.addEventListener("pagehide",  function () {
            let data = new Blob([JSON.stringify({gameId: gameId, userId: userid})], {
                type: 'application/json; charset=UTF-8',
            });
          navigator.sendBeacon("/destory",data)
        }, false);
        window.addEventListener("pageshow",  async function () {
            await checkEnqueue();
        });
    }

注意:
ios 的 window.addEventListener("pagehide", function () {} 监听方法内,不支持 ajax,需要通过

navigator.sendBeacon("url",data) 来调后台接口。

相关文章
|
缓存 JavaScript
vue阻止浏览器刷新和关闭页面提示
使用场景:在使用vuex进行缓存管理时,页面的缓存会随着页面关闭而消失,如果缓存动作仍在进行中,关闭页面会导致数据丢失,此时需要阻止页面关闭
1603 3
|
移动开发 小程序 API
微信外部浏览器或短信链接唤起微信小程序的解决方案
微信外部浏览器或短信链接唤起微信小程序的解决方案
2361 1
|
2月前
|
前端开发
WebView2 控件(基于 Microsoft Edge (Chromium) 的嵌入式浏览器控件),保存资源(图片、脚本、CSS)
WebView2 控件(基于 Microsoft Edge (Chromium) 的嵌入式浏览器控件),保存资源(图片、脚本、CSS)
187 25
|
11月前
|
Web App开发 移动开发 前端开发
H5微信外支付(移动端浏览器)
H5微信外支付(移动端浏览器)
383 1
 H5微信外支付(移动端浏览器)
|
小程序
微信小程序监听页面滚动位置
微信小程序监听页面滚动位置
872 0
|
Web App开发 Linux Android开发
Chrome谷歌浏览器的WeChat微信模拟器,既可以设置模拟很多型号的手机设备Mozilla
Chrome谷歌浏览器的WeChat微信模拟器,既可以设置模拟很多型号的手机设备Mozilla
|
小程序 JavaScript 前端开发
微信小程序(十七)小程序监听返回键跳转事件(安卓返回也适用)
onUnload:function(){ wx.redirectTo({ url: '../index/index' }) wx.navigateTo({ url: '../index/index' }) wx.switchTab({ url: '../../member/member' }) }
1606 0
|
编解码 JavaScript
【vue2】vue2 适配pc端,解决浏览器缩放问题,解决电脑显示设置缩放、分辨率问题
【vue2】vue2 适配pc端,解决浏览器缩放问题,解决电脑显示设置缩放、分辨率问题
1561 1
|
JavaScript 前端开发
WebView2 控件(基于 Microsoft Edge (Chromium) 的嵌入式浏览器控件),获取网页加载后的标题
在使用 WebView2 控件(基于 Microsoft Edge (Chromium) 的嵌入式浏览器控件)时,要获取网页加载后的标题,可以监听 WebView2 的 NavigationCompleted 事件。这个事件被触发时,表示导航已完成,此时执行JavaScript代码可以安全地获取网页的标题。
593 0
WebView2 控件(基于 Microsoft Edge (Chromium) 的嵌入式浏览器控件),获取网页加载后的标题