You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

页面卸载时AJAX请求失效问题求助(Chrome 104 Android)

页面卸载时发送阅读时长请求失败的解决方案

在Chrome Android 104环境下,你用beforeunload事件结合同步AJAX发送请求失效的核心原因是:现代浏览器(尤其是移动端)为了优化页面卸载速度、避免阻塞用户操作,会限制甚至直接中断卸载阶段的同步请求。

下面是几种可行的解决办法:

方案1:使用navigator.sendBeacon()(推荐)

这是浏览器专门为页面卸载/后台场景设计的统计数据上报API,异步执行但浏览器会保证请求完成,不会阻塞页面卸载流程。

代码示例:

document.addEventListener('visibilitychange', function() {
  // 页面隐藏时就发送数据(覆盖切换标签、锁屏、卸载等场景)
  if (document.visibilityState === 'hidden') {
    const formData = new FormData();
    formData.append('report', 120); // 替换为实际计算的阅读时长
    navigator.sendBeacon('', formData); // 第一个参数填入你的接口URL
  }
});

说明:用visibilitychange替代beforeunload能覆盖更多用户离开场景,且数据发送时机更早,成功率更高;sendBeacon支持FormData、Blob或字符串格式,无法直接传JSON时用FormData封装即可。

方案2:用fetch结合keepalive选项

如果需要自定义请求头、发送JSON格式数据,可以借助fetch的keepalive参数:

document.addEventListener('visibilitychange', function() {
  if (document.visibilityState === 'hidden') {
    fetch('', {
      method: 'POST',
      body: JSON.stringify({ report: 120 }),
      headers: {
        'Content-Type': 'application/json'
      },
      keepalive: true
    });
  }
});

注意:keepalive有数据大小限制(通常为64KB),适合数据量不大的上报场景。

为什么原同步AJAX方案失效?

Chrome等现代浏览器在页面卸载阶段会优先处理关闭/跳转逻辑,同步AJAX会阻塞该过程,浏览器为保障用户体验会直接取消这类请求,移动端因资源限制,这种限制会更严格。

内容的提问来源于stack exchange,提问作者user20553892

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:01:07