卸载前的HTTP请求:sendBeacon与img.src

Emm*_*ler 6 javascript browser analytics http sendbeacon

beforeunload处理程序的上下文中,标记fetch(keep-alive: true)src属性和设置img标记的属性之间的功能区别是什么?哪些是发出GET请求的首选方法?

背景:

我想beforeunload在JavaScript代码的处理程序中发送HTTP GET请求。Navigator.sendBeacon的文档讨论了此用例的优点,但是

sendBeacon()方法不提供自定义请求方法的功能

显然,几年前对此类功能的请求很多,最终提出了对use 的推荐,即使用fetch()内部调用by的浏览器方法sendBeacon,并设置了一些特定的标志来解决unload请求问题:

需要此类请求的非默认设置的应用程序应使用将FETCHkeep-alive标志设置为true 的API

fetch(url, {
  method: ..., 
  body: ...,            
  headers: ...,       
  credentials: 'include',
  mode: 'cors',
  keep-alive: true,
})
Run Code Online (Sandbox Code Playgroud)

据我所知,这种调用在功能上等效于Navigator.sendBeacon,键设置为keep-alive: true

显然,HTML <img>标签 采用keep-alive: true根据规范(重点煤矿):

请求具有关联的keepalive标志...该标志可用于允许请求超过环境设置对象的寿命,例如,navigator.sendBeacon和HTML img元素设置此标志

我本文档的理解是,制作GET上要求unload通过img元素的src属性在功能上等同于调用fetch()keep-alive: true,这是本身在功能上等同于调用sendBeacon(如果sendBeacon可能使GET请求)。

这个准确吗?

Ann*_*nne 6

根据https://fetch.spec.whatwg.org/#request-class它是keepalive,不是keep-alive

除此之外,是的。添加此功能是fetch()为了过时对sendBeacon().