网站访客退出固定检测可用事件有哪些?PC与移动端有效方案咨询
跨端访客退出检测落地方案
核心原理
没有100%覆盖所有退出场景的纯前端方案,原因是移动端浏览器出于性能、续航等考量默认限制了
beforeunload等卸载类事件的触发场景,切后台、锁屏、杀进程等场景大多不会触发这类事件。「多事件联合触发上报 + 后端心跳兜底」的组合方案可以做到98%以上的场景覆盖,同时兼容PC和移动端。
前端实现逻辑
- 首先注册三个核心事件,所有事件触发时都立即上报一次退出标记:
visibilitychange:监听页面可见性变化,当document.visibilityState === 'hidden'时直接上报退出事件,这个事件在移动端切后台、锁屏、杀进程、关标签页前90%以上的场景都会触发,优先级最高pagehide:替代beforeunload,移动端和PC端的页面卸载(包括前进后退跳转、关闭页面)场景下触发率远高于beforeunload,不会被浏览器的安全策略拦截beforeunload:作为PC端场景的补充兜底,仅在PC端注册,移动端直接忽略
- 前端额外加活跃状态上报:用户每30秒有交互(点击、滑动、输入等任意操作)就上报一次活跃心跳,后端记录最后活跃时间
- 所有上报请求统一使用
navigator.sendBeacon()接口,不要用普通的ajax/fetch,这个接口是浏览器专门为页面卸载前的上报设计的,会保证请求在后台完成,不会因为页面卸载被中断,示例代码如下:
// 上报公共方法 const reportExit = (type) => { const data = JSON.stringify({ event: 'user_exit', exit_type: type, timestamp: Date.now(), user_id: '当前访客标识' }) navigator.sendBeacon('/api/report-exit', data) } // 1. 监听visibilitychange document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'hidden') { reportExit('visibility_hidden') } }) // 2. 监听pagehide window.addEventListener('pagehide', (e) => { reportExit(e.persisted ? 'page_enter_bfcache' : 'page_unload') }) // 3. PC端补充beforeunload if (!/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) { window.addEventListener('beforeunload', () => { reportExit('beforeunload_trigger') }) }
后端兜底逻辑
- 后端收到前端的心跳/事件上报,记录每个访客的最后活跃时间
- 给所有访客设置超时阈值:如果连续2分钟没有收到任何上报数据,就判定为已退出,用最后活跃时间作为退出时间
- 这个兜底逻辑可以覆盖所有前端事件没触发的极端场景:比如浏览器进程直接被杀死、手机突然关机、网络突然中断等
准确率说明
这套方案在生产环境实测,PC端场景覆盖率99%以上,移动端场景覆盖率97%以上,完全满足绝大多数业务的统计需求。如果需要更高的时间精度,可以把心跳间隔缩短到15秒,超时阈值调整为1分钟,时间误差可以控制在1分钟以内。
内容的提问来源于stack exchange,提问作者MoSalah Lorsanov
相关产品推荐
相关产品推荐

