页面关闭时日志上报总失败怎么办?
最近在做监控优化,发现用户关闭页面时上报的日志经常丢失。我在window.unload事件里用了fetch加keepalive: true,还试过把请求放在setTimeout里,但有时候还是会丢失数据,特别是页面突然关闭的时候。
报错日志显示跨域问题和请求中断,代码大概是这样的:
window.addEventListener('beforeunload', () => {
setTimeout(() => {
fetch('/log', {
method: 'POST',
body: JSON.stringify(logData),
keepalive: true
});
}, 0);
});
有没有更可靠的上报方案?看到有人说用navigator.sendBeacon,但不太确定具体怎么用才能保证成功率?
sendBeacon在浏览器关门前会同步发送请求,不会受页面关闭影响,而且不依赖JS异步回调,比fetch+keepalive靠谱得多,懒人方案直接抄这个模板就行。
navigator.sendBeacon替代 fetch,它专为页面关闭时的数据上报设计,可靠性更高。代码改成这样:如果还遇到跨域问题,后端得配合加CORS白名单,不然真没招了。