企业微信和页面离开事件

💡 前言

最近在开发中遇到了一个需求:在用户关闭浏览器时上报。然而在企业微信环境下却发现了一些意想不到的行为差异。本文将详细记录这次踩坑经历,希望能为遇到类似问题的开发者提供参考。

如果你有更好的方案也请告知我。


🎯 核心结论

经过详细测试,发现不同浏览器环境下的行为存在显著差异:

📱 企业微信浏览器

  • 刷新场景 :beforeunload 事件未触发 ,unload 事件正常触发 ,sendBeacon 可以发送

  • 关闭场景 :beforeunload 和 unload 事件均未触发 ,sendBeacon 无法发送

🌐 Chrome & Safari 浏览器

  • 刷新/关闭场景 :beforeunload 和 unload 事件均正常触发 ,sendBeacon 均可发送

⚠️ 注意:本测试仅在 Mac 环境下进行,Windows 环境下的表现可能有所不同。


🧪 测试代码

为了验证这个问题,我编写了以下测试代码:

🔗 在线演示 :CodeSandbox

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  </head>
  <body>
    <div id="nowTime"></div>
    <div id="beforeUnloadTime"></div>
    <div id="unloadTime"></div>
    <script>
      document.querySelector("#nowTime").innerHTML = "nowTime " + new Date();
      document.querySelector("#beforeUnloadTime").innerHTML =
        "beforeunloadTime " + localStorage.getItem("beforeunloadTime");
      document.querySelector("#unloadTime").innerHTML =
        "unloadTime " + localStorage.getItem("unloadTime");

      window.addEventListener("beforeunload", (event) => {
        localStorage.setItem("beforeunloadTime", "" + new Date());
        navigator.sendBeacon("/api/beforeunload/sendBeacon");
      });
      window.addEventListener("unload", (event) => {
        localStorage.setItem("unloadTime", "" + new Date());
        navigator.sendBeacon("/api/unload/sendBeacon");
      });
    </script>
  </body>
</html>

📊 详细测试结果

🏢 企业微信环境测试

🔄 刷新场景

  • 事件触发情况 :仅 unload 事件触发,beforeunload 事件失效
  • 网络请求情况 :仅 unload 中的 sendBeacon 成功发送

❌ 关闭场景

  • 事件触发情况 :beforeunload 和 unload 事件均未触发
  • 网络请求情况 :无任何 sendBeacon 请求发出

🌐 Chrome 浏览器测试

🔄 刷新场景

  • 事件触发情况 :beforeunload 和 unload 事件均正常触发
  • 网络请求情况 :两个 sendBeacon 请求均成功发送

❌ 关闭场景

  • 事件触发情况 :beforeunload 和 unload 事件均正常触发
  • 网络请求情况 :两个 sendBeacon 请求均成功发送

🧭 Safari 浏览器测试

🔄 刷新场景

  • 事件触发情况 :beforeunload 和 unload 事件均正常触发
  • 网络请求情况 :两个 sendBeacon 请求均成功发送

❌ 关闭场景

  • 事件触发情况 :beforeunload 和 unload 事件均正常触发
  • 网络请求情况 :两个 sendBeacon 请求均成功发送

🔧 测试环境配置

📋 测试环境说明

  • 操作系统:macOS(Windows 环境需要开发者自行验证)

  • 企业微信:基于 WKWebView 内核

  • 对比浏览器:Chrome、Safari 最新版本

🛠️ 企业微信调试模式开启方法

为了方便测试,可以开启企业微信的调试模式:

  1. 开启调试模式 :按下组合键 Ctrl + Option + Command + Shift + D

  2. 找到调试选项:在弹出的菜单中选择相应选项

  1. 使用调试窗口:会弹出一个专用的调试窗口,可以直接输入 URL 进行测试
相关推荐
java1234_小锋2 小时前
【技术专题】HTML5 网页技术 - HTML5 Canvas 基础以及动画入门
前端·html·html5
知了学历孙老师5 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
ShineWinsu7 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
福兮说8 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
程序员老赵10 小时前
Docker 部署青龙面板:轻松搭建定时任务管理平台
前端·docker·开源
Swot10 小时前
Asciidoctor 公式数字下标错位问题:原因分析与解决方案
前端
Swot10 小时前
leo-editor 中将 Markdown 内容转成 asciidoc 格式
前端
狒狒AI10 小时前
Remotion / GSAP+Three / HyperFrames / Skia 四栈实测:代码渲染知识视频的选栈方法(附开源技能)
前端·人工智能·aigc
修炼的dance10 小时前
浏览器里导出H.265,8.5秒和55.5秒差在硬件
前端
补码缩写10 小时前
WebCodecs选编码器,探测之后还要验解码和播放
前端