正确的在unload事件中发起请求

总结

unloadbeforeunload事件中我们应当使用Navigator.sendBeacon函数来进行请求的发送,以避免以下问题:

  1. 异步请求发送很可能失败
  2. 同步请求导致了页面卸载被延迟

同时,我们应当做兼容性检查,如果浏览器不支持sendBeacon时,可采用同步请求的方式处理

参数

参数是将要发送的 ArrayBufferViewBlob, DOMString 或者 FormData 类型的数据。

JSON参数示例

1
2
3
4
5
const data = new Blob([JSON.stringify(jsonObj)], {
type: 'application/json; charset=UTF-8',
});

navigator.sendBeacon(requestUrl, data);

FormData示例

1
2
3
4
5
let data = new FormData();
data.append('username', 'surwei');
data.append('age', '26');

navigator.sendBeacon(requestUrl, data);

其它

如何设置header?

暂未找到设置header的方法,目前的处理是,将token作为参数传递到后台,由后台单独处理

参数大小限制

大约为65536(2^16),不同浏览器不同版本可能不一样

参考资料

  1. Navigator.sendBeacon()

  2. Navigator.sendBeacon() to pass header information

  3. Navigator.sendBeacon()数据大小限制


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!