Beacon API

这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。

Beacon 接口用于将异步和非阻塞请求发送到服务器。信标(Beacon )请求使用HTTP协议中的POST方法,请求通常不需要响应。这个请求被保证在,页面的unload状态从发起到完成之前,被发送。而并不需要一个阻塞请求,例如 XMLHttpRequest

Beacon API 的示例用例是记录活动并向服务器发送分析数据。

本文档中描述的接口的示例代码包含在使用信标API中。

为什么是信标?

Beacon 接口满足了分析和诊断代码的需要,这些代码通常会尝试在卸载文档之前将数据发送到 web服务器。发送数据的任何过早时机都可能导致错失收集数据的机会。但是,确保在卸载文档期间发送数据是开发人员难以做到的。

用户代理通常会忽略卸载文档处理程序中的异步 XMLHttpRequests 请求。若要解决此问题,为了分析和诊断代码,通常会在 unload 事件或 beforeunload 事件中创建同步 XMLHttpRequest 请求以提交数据。同步 XMLHttpRequest 请求强制浏览器延迟卸载文档,并使下一个页面跳转看起来较慢。下一页面没有任何办法来避免这种页面加载性能不佳的感觉。

其他技术也可以用来确保提交数据。其中一种技术是通过创建 Image 元素并在卸载文档处理程序中设置其 src 属性来延迟卸载以提交数据。由于大多数用户代理会延迟文档卸载,以完成挂起的图片加载,因此可以在卸载过程中提交数据。另一种方法是在卸载处理程序中创建一个无操作循环,花费数秒以延迟卸载并将数据提交到服务器。

但是上述技术不仅代表了较差的编码模式,其中一些还是不可靠的,会导致下一个导航的页面加载性能较差的感觉。信标 API 提供了解决这些问题的标准方法。

全局环境

Beacon API 的 Navigator.sendBeacon() 方法用于在全局浏览上下文中向服务器发送数据信标。该方法有两个参数,URL和要在请求中发送的数据data。data参数是可选的,其类型可以是 ArrayBufferViewBlobDOMString FormData如果浏览器成功的以队列形式排列了用于传递的请求,则该方法返回“true”,否则返回“false”。

生产环境

Beacon API的 WorkerNavigator.sendBeacon() 方法用于从 worker global scope 向服务器发送数据信标。该方法有两个参数,URL和要在请求中发送的数据data。data参数是可选的,其类型可以是 ArrayBufferViewBlobDOMStringFormData。如果浏览器成功的以队列形式排列了用于传递的请求,则该方法返回“true”,否则返回“false”。

浏览器兼容性

Navigator.sendBeacon().Browser_compatibility表说明了该方法具有相对广泛地实现。但是,WorkerNavigator.sendBeacon().Browser_compatibility数据显示该方法没有被实现。

相关知识