【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进行缓存管理时,页面的缓存会随着页面关闭而消失,如果缓存动作仍在进行中,关闭页面会导致数据丢失,此时需要阻止页面关闭
1891 3
|
移动开发 小程序 API
微信外部浏览器或短信链接唤起微信小程序的解决方案
微信外部浏览器或短信链接唤起微信小程序的解决方案
3460 1
|
人工智能 Python
【够用就好003】发布人生第二款软件pc微信多开
发布人生第二款软件pc微信多开,在deepseek和豆包的帮助下封装了这个微信多开小工具。
|
Web App开发 移动开发 前端开发
H5微信外支付(移动端浏览器)
H5微信外支付(移动端浏览器)
743 1
 H5微信外支付(移动端浏览器)
|
小程序
微信小程序监听页面滚动位置
微信小程序监听页面滚动位置
1146 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' }) }
1989 0
|
安全 JavaScript 前端开发
kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页
在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:
|
小程序 数据库 C++
【微信小程序-原生开发】实用教程17 - 详情页触发列表页刷新,点击图片放大预览,转发给好友/群,分享到朋友圈
【微信小程序-原生开发】实用教程17 - 详情页触发列表页刷新,点击图片放大预览,转发给好友/群,分享到朋友圈
275 0
|
移动开发 小程序 前端开发
php + h5使用 scheme页面跳转微信小程序-其他浏览器一键跳转到微信并打开小程序
php + h5使用 scheme页面跳转微信小程序-其他浏览器一键跳转到微信并打开小程序
619 0