如何在浏览器页面关闭时发送 API 请求

需求:在用户关闭页面的的时候需要发送API请求,来记录用户已关闭页面的操作

对于 ajax 发起异步请求,若在发送过程中 刷新或关闭 浏览器,请求会被自动终止。

异步方式的 ajax 请求被浏览器自动取消,无法将数据正常推送到后台。

目前,谷歌浏览器已经不允许在页面关闭期间发起 同步 XHR 请求,建议使用 sendBeacon 或者 fetch

1、sendBeacon

navigator.sendBeacon()  方法可用于通过 HTTP 将少量数据 异步 传输到 Web 服务器。

 官方链接Navigator.sendBeacon() - Web API 接口参考 | MDN

// 通过 Blob 方式发送 JSON 数据
const blob = new Blob(
  [JSON.stringify({ ... })], 
  { type: 'application/json; charset=UTF-8' }
);
// 发送请求
navigator.sendBeacon(url, blob);
  • url: 指定将要被发送到的网络地址;
  • data: 可选,是将要发送的 ArrayBufferTypedArrayBlobStringFormData 或 URLSearchParams 类型的数据。
  • return: 返回值。当用户代理成功把数据加入传输队列时,sendBeacon()  方法将会返回 true,否则返回 false

特点:

  1. 通过 HTTP POST 请求方式 异步 发送数据,同时不会延迟页面的卸载或影响下一导航的载入性能;
  2. 支持跨域,但不支持自定义 headers 请求头,这意味着:如果用户信息 Access-Token 是作为请求头信息传递,需要后台接口支持 url querystring 参数传递解析。
  3. 考虑其兼容性。

1、fetch

当使用 fetch() 请求时,如果把 RequestInit.keeplive 设置为 true,即便页面被终止请求也会保持连接。

fetch(url, {
  method: 'POST',
  body: JSON.stringify({ ... }),
  headers: {
    'Content-Type': 'application/json', 
     "access-token": '...'
  },
  keepalive: true, // 页面被终止请求也会保持连接
});

推荐使用 Fetch API 实现

注意:

  1. 传输数据大小限制无法发送兆字节的数数据,我们可以并行执行多个 keepalive 请求,但它们的 body 长度之和不得超过 64KB
  2. 无法处理服务器响应在网页文档卸载后,尽管设置 keepalive fetch 请求可以成功,但后续的响应处理无法工作。所以在大多数情况下,例如发送数据信息,因为服务器只接收数据,并通常向此类请求发送空的响应。

浏览器关闭或刷新相关事件

# 浏览器关闭前
document.addEventListener("beforeUnload", () => {});

# 浏览器关闭,隐藏和tab切换
document.addEventListener("visibilitychange", () => {
  if (document.visibilityState === "hidden") {
  } else {
  }
});

# 浏览器关闭
document.addEventListener("unload", () => {});

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cherry014

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值