window.addEventListener("beforeunload", () => {
let oReq = new XMLHttpRequest();
oReq.open("POST", "http://127.0.0.1:1991/loginout");
oReq.send(JSON.stringify({name: "编程三昧"}));
上面这种方式由点小问题:
- 刷新页面时基本满足需求(偶尔也会有后台接收不到请求的现象,但概率很低)
- 关闭页面时,后台接收不到请求
navigator.sendBeacon()
这个接口专门用来做这个事的
描述
这个方法主要用于满足统计和诊断代码的需要,这些代码通常尝试在卸载(unload)文档之前向web服务器发送数据。
语法
navigator.sendBeacon(url, data);
参数
url表明data将要被发送到的网络地址。data参数是将要发送的ArrayBufferView或Blob、DOMString或者FormData类型的数据。
返回值
当用户代理成功把数据加入传输队列时,sendBeacon() 方法将会返回 true,否则返回 false。
代码
window.addEventListener("beforeunload", (e) => {
const data = {name: "页面关闭or刷新"};
window.navigator.sendBeacon("http://127.0.0.1:1991/loginout", JSON.stringify(data));
});
效果
不管是刷新页面还是关闭页面,后台都能接收到前端发送过来的请求,完美。