Broadcast Channel API

Baseline 2022

Newly available

Since March 2022, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.

备注: 此特性在 Web Worker 中可用。

Broadcast Channel API 允许浏览上下文(即 windowtabframeiframe)与同的 worker 之间进行基本通信。

通过创建 BroadcastChannel 对象,你可以接收发布到该对象的任何消息。你不必维护对要与之通信的框架或 worker 的引用:他们可以通过构建具有相同名称的 BroadcastChannel 来“订阅”特定频道,并在它们之间进行双向通信。

Broadcast Channel API 的原理

广播频道接口

创建或加入某个频道

客户端通过创建 BroadcastChannel 对象加入广播频道。其构造函数只接受一个参数:频道的名称。如果它是第一个连接到该广播频道名称的客户端,则会创建底层频道。

js
// 连接至广播频道
const bc = new BroadcastChannel("test_channel");

发送消息

在创建的 BroadcastChannel 对象上调用 postMessage() 方法就足够了,该方法接受任何对象作为参数。示例字符串消息:

js
// 发送非常简单的消息的示例
bc.postMessage("这是一条测试消息。");

发送到通道的数据使用结构化克隆算法进行序列化。这意味着你可以安全地发送各种各样的数据对象,而无需自己对其进行序列化。

API 不会将任何语义与消息关联,因此由代码来决定要接收什么类型的消息以及如何处理它们。

接收消息

发布消息时,会向连接到此频道的每个 BroadcastChannel 对象发送一个 message 事件。可以使用 onmessage 事件处理器为此事件运行一个函数:

js
// 仅将事件记录到控制台的处理器:
bc.onmessage = (event) => {
  console.log(event);
};

断开频道

要离开频道,请调用对象上的 close() 方法。这会断开对象与底层频道的连接,从而允许垃圾回收。

js
// 断开频道
bc.close();

总结

Broadcast Channel API 的独立接口允许跨上下文通信。它可用于检测同一来源内其他标签页中的用户操作,例如用户登录或退出时。

消息传递协议未定义,不同的浏览上下文需要自行实现;规范中没有协商或要求。

接口

BroadcastChannel

表示任何给定浏览上下文都可以订阅的具名频道。

规范

Specification
HTML Standard
# broadcasting-to-other-browsing-contexts

浏览器兼容性

BCD tables only load in the browser

参见