刷新页面前, 我们能够将请求发出么

背景

用户离开页面时, 浏览器会取消正在发出的异步请求。这是因为默认情况下,异步请求是非阻塞的。一旦请求被放入队列中,网络请求交给浏览器的网络线程 (网络线程不会阻塞 JS 线程)。这意味着当页面进入 "终止" 状态时, 它们可能被销毁。 那究竟有方案能够保证页面刷新前接口的调用么?

方案

javascript 复制代码
// 监听页面卸载事件(刷新/关闭)
window.addEventListener('beforeunload', () => {
  const data = JSON.stringify({ event: 'refresh', time: Date.now() });
  navigator.sendBeacon('/api/log', data);
});

优势

  • 专为页面卸载场景设计
  • 不阻塞页面卸载过程
  • 能处理大容量数据(现代浏览器支持最高64KB)
  • 自动处理内容类型(可发送Blob/字符串)

参考 MDN 的介绍

navigator.sendBeacon

方案2:使用 fetch() + keepalive

javascript 复制代码
window.addEventListener('beforeunload', async () => {
  try {
    await fetch('/api/log', {
      method: 'POST',
      body: JSON.stringify({ action: 'page_refresh' }),
      keepalive: true,  // 关键参数
      headers: { 'Content-Type': 'application/json' }
    });
  } catch (e) {
    console.error('请求失败,但页面已卸载', e);
  }
});

注意事项

  1. 仅适用于 Chrome/Edge(Firefox 不支持)
  2. 请求头受限(无法设置 Content-Length 等)
  3. 响应不可读取(设计上只保证发送)

最终选择方案 2 实现需求。

相关推荐
Wect1 天前
浏览器缓存机制
前端·面试·浏览器
FliPPeDround5 天前
浏览器扩展 E2E 测试的救星:vitest-environment-web-ext 让你告别繁琐配置
e2e·浏览器·测试
SuperEugene5 天前
浏览器存储:localStorage / sessionStorage / cookie 应该怎么用
前端·javascript·面试·浏览器
宁雨桥5 天前
浏览器渲染原理
前端·浏览器·原理
YZ0997 天前
2026年如何批量保存小红书作者主页的视频、图片和文案?
经验分享·浏览器·插件
程序员ys7 天前
网页白屏的原理与优化
前端·性能优化·浏览器
Wect9 天前
从输入URL到页面显示的完整技术流程
前端·面试·浏览器
NEXT069 天前
从输入 URL 到页面展示的完整链路解析
网络协议·面试·浏览器
CappuccinoRose12 天前
CSS 语法学习文档(十五)
前端·学习·重构·渲染·浏览器
REDcker13 天前
Media Source Extensions (MSE) 详解
前端·网络·chrome·浏览器·web·js