能,但必须用对时机、数据类型和事件源,否则大概率发不出去;应监听pagehide事件并校验event.persisted===false,传urlsearchparams或blob等合法类型,确保同源且服务端不依赖凭据。

能,但必须满足三个硬性条件:data 类型合法、URL 同源、服务端不依赖 session/cookie。 用错类型或跨域时,navigator.sendBeacon() 会静默失败——不报错、不发请求、也不重试。
sendBeacon 的 data 参数只能是这几种类型
传字符串、普通对象或 JSON 字面量会直接失效。浏览器只接受二进制兼容类型:
-
URLSearchParams(推荐,轻量且语义清晰) -
Blob(需显式指定type,如'application/x-www-form-urlencoded') -
FormData(适合带文件字段的场景,但注意多数埋点不需要) -
ArrayBuffer或Uint8Array(底层控制强,但日常埋点没必要)
错误示例:navigator.sendBeacon('/log', { event: 'exit' }) → 不发请求;正确写法:navigator.sendBeacon('/log', new URLSearchParams({ event: 'exit' }))。
pagehide 比 unload / beforeunload 更可靠
unload 在部分浏览器(如 Chrome 115+)中已被限制触发,beforeunload 只适用于用户主动跳转前的确认弹窗,不能用于静默上报。真正能覆盖「标签页关闭、后台切换、前进后退」所有卸载路径的是 pagehide:
- 它在页面进入隐藏状态时触发,包括用户切走、最小化、关标签等场景
- 比
visibilitychange更早,且保证页面资源尚未释放 - 不要监听
unload做兜底——它大概率不会执行
典型写法:window.addEventListener('pagehide', () => { navigator.sendBeacon('/log', new URLSearchParams(...)); });
服务端接收时必须忽略凭据和响应依赖
浏览器在页面卸载后发送请求,此时:
- 部分浏览器已清空
document.cookie和认证凭据,所以别指望服务端靠 session 判断用户身份 - 请求头中的
Origin和Referer可能为空或不可靠 - 服务端不能返回重定向(302)、不能依赖响应体做后续逻辑(前端收不到)
- 必须能处理
application/x-www-form-urlencoded或text/plain(取决于你传的Blobtype)
例如 Node.js Express 中,要用 express.urlencoded({ extended: true }) 中间件,而不是只配 json()。
64KB 限制和 false 返回值不是警告,是硬边界
navigator.sendBeacon() 返回 false 表示数据根本没进队列,常见原因:
- data 超过浏览器限制(Chrome 约 64KB,Firefox 约 256KB,Safari 更严)
- URL 非同源(跨域请求会被浏览器直接拦截,不发包)
- 页面已完全销毁(极少数情况,在
pagehide回调里做复杂计算再调用 sendBeacon,可能错过时机)
别把 false 当作“稍后重试”的信号——它意味着这次机会彻底丢失。建议提前截断日志字段、压缩键名(如用 u 代替 user_id),并始终用 console.warn 记录失败,方便灰度期排查。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











