一、为什么需要判断用户离开页面?
在现代 Web 应用中,用户离开页面的行为触发的场景包括:
- 切换浏览器标签页 / 最小化窗口(页面不可见)
- 关闭标签页 / 浏览器
- 导航到新 URL
- 移动端切换 App 或返回主屏幕
这类行为的监测直接关联用户体验优化、数据埋点、资源释放等核心需求,例如:
- 暂停视频播放 / 动画以节省资源
- 上报用户行为数据
- 提示未保存数据的警告
二、核心检测方案与技术实现
方法一:Page Visibility API —— 现代浏览器的可见性监测标准
核心原理:通过监听页面可见性变化,判断用户是否切换标签页或最小化窗口。
document.addEventListener('visibilitychange', () => {
  if (document.hidden) {
    console.log('用户离开当前页面(标签页切换/窗口最小化)');
    
    pauseVideo();
    stopPolling();
  } else {
    console.log('用户返回当前页面');
    
    resumeVideo();
    startPolling();
  }
});
适用场景:
- 视频 / 音频播放控制 
- 动画 / 轮播图暂停与恢复 
- 网络请求的暂停与续传 
优缺点对比:

方法二:beforeunload 与 unload 事件 —— 传统的页面卸载监听
1. beforeunload 事件(离开前确认)
window.addEventListener('beforeunload', (event) => {  
  // 防止未保存数据丢失(浏览器会显示默认确认框)
  event.preventDefault()
  event.returnValue = '确定要离开吗?未保存的数据将丢失'
  // 注意:现代浏览器会忽略returnValue,显示标准化提示
})
2. unload 事件(页面开始卸载时触发)
window.addEventListener('unload', () => {
  console.log('用户正在关闭或离开页面');
  
  
});
适用场景:
- 提示用户保存未完成的表单数据 
- 简单的资源清理(同步操作) 
优缺点对比:

方法三:navigator.sendBeacon () —— 可靠的数据上报方案
核心优势:解决 unload 事件中网络请求不可靠的问题,确保数据发送完成。
window.addEventListener('pagehide', () => {
  const analyticsData = {
    pageDuration: calculateStayTime(),
    lastAction: 'leave-page'
  };
  
  navigator.sendBeacon('/analytics', JSON.stringify(analyticsData));
});
适用场景:
- 离开页面时的用户行为数据上报 
- 统计页面停留时间、最后操作等埋点数据 
关键特性:
- 浏览器保证数据发送完成,即使页面已关闭
- 支持 POST 请求,数据大小限制通常为 64KB
方法四:pagehide 与 pageshow 事件 —— 应对往返缓存(bfcache)
核心原理:监听页面进入 / 退出缓存状态,解决 unload 在 bfcache 下不触发的问题。
window.addEventListener('pagehide', (event) => {
  if (event.persisted) {
    console.log('页面进入往返缓存(点击后退/前进时缓存)');
  } else {
    console.log('页面正常卸载');
  }
  
  navigator.sendBeacon('/log', getExitData());
});
window.addEventListener('pageshow', (event) => {
  if (event.persisted) {
    console.log('页面从缓存中恢复');
    
    resetPageState();
  }
});
适用场景:
- 移动端浏览器的页面缓存处理
- 确保数据上报在所有卸载场景下触发
三、最佳实践与组合方案
- 可见性监测:优先使用 Page Visibility API处理标签页切换场景。
- 数据上报:结合 pagehide与navigator.sendBeacon(),确保数据可靠发送。
- 防数据丢失:谨慎使用 beforeunload,仅在必要时提示用户保存数据。
- 资源管理:在 visibilitychange中暂停非必要任务,在pageshow中恢复。
四、兼容性与性能优化
- 浏览器兼容:Page Visibility API在 IE10+、Chrome、Firefox 等现代浏览器中全支持;sendBeacon()在 IE11 + 及主流浏览器中可用。
- 性能建议:
通过组合运用上述 API,前端可以精准捕获用户离开页面的各类场景,在不影响性能的前提下实现智能化的用户行为响应,为应用体验优化和数据采集提供可靠支撑。
转自https://juejin.cn/post/7520063683179970623
该文章在 2025/9/6 17:20:19 编辑过