Using the Beacon API

您正在阅读此内容的英文版本,因为该语系尚未翻译。 帮助我们翻译此文章吧!

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

Beacon 接口为Web服务器调度异步和非阻塞请求。

  • Beacon 请求使用HTTP的POST方法,并且不需要有响应。
  • Beacon 请求能确保在页面触发unload之前,就已经初始化。

这篇文档包含了Beacon接口的一些例子,可以在 Beacon API 查阅对应的API。

Beacon API 的 Navigator.sendBeacon() ,将会从当前的全局的浏览器上下文中,向服务器发起一个 beacon 请求。这个方法需要两个参数:  URL 以及要发送的数据 data 。其中 data 参数是可选的,它的类型可以为 ArrayBufferView, Blob, DOMString, 或者 FormData.

如果浏览器成功地将 beacon 请求加入到待发送的队列里,这个方法将会返回 true ,否则将会返回 false 。

下面的例子在window上注册了 load 事件和  beforeunload 事件的回调函数, 并且在回调函数里面调用了 sendBeacon() 方法。

window.onload = window.onunload = function analytics(event) {
  if (!navigator.sendBeacon) return;

  var url = "https://example.com/analytics";
  // 创建待发送数据
  var data = "state=" + event.type + "&location=" + location.href;

  // 发送beacon请求
  var status = navigator.sendBeacon(url, data);

  // 打印数据以及结果
  console.log("sendBeacon: URL = ", url, "; data = ", data, "; status = ", status);
};

接下来的列子在 window 上创建了一个 submit 事件的回调函数,并且当submit事件触发时,调用 sendBeacon()方法。

window.onsubmit = function send_analytics() {
  var data = JSON.stringify({
    location: location.href,
    time: Date()
  });

  navigator.sendBeacon('/analytics', data);
};

WorkerNavigator.sendBeacon()

Beacon API 的 WorkerNavigator.sendBeacon() 的使用方法,跟平常的使用方法完全相同。在worker环境中,这个方法存在于 worker global scope 

在接下来的例子中展示了,使用  Worker 发送了一个beacon请求,其中,请求数据来源于主页面。

这是主页面的代码片段:

function worker_send(url, data) {
  // 创建worker对象
  var myWorker = new Worker("worker-using.js");

  // 发送URL以及data给worker
  myWorker.postMessage([url, data]);

  // 注册回调函数来接收来自worker的成功或失败的信息
  myWorker.onmessage = function(event) {
    var msg = event.data;
    // 打印worker的发送状态
    console.log("Worker reply: sendBeacon() status = " + msg);
  };  
}

这是worker中的代码片段 (worker-using.js):

onmessage = function(event) {
  var msg = event.data;
  // 从msg中获取URL和data
  var url = msg[0];
  var data = msg[1];

  // 如果浏览器支持在worker里面调用sendBeacon(), 那就发送beacon请求。否则
  // 返回失败信息给主页面
  if (self.navigator.sendBeacon) {
    var status = self.navigator.sendBeacon(url, data); 
    postMessage(status ? "success" : "fail");
  } else {
    postMessage("Worker: self.navigator.sendBeacon is unsupported");
  }
}

查看更多