广播通道 API

基线 2022

新功能

2022年3月起,此功能可在最新的设备和浏览器版本中使用。此功能可能无法在较旧的设备或浏览器中使用。

注意:此功能在Web Workers中可用。

广播通道 API允许在同一来源上的浏览上下文(即,窗口选项卡框架iframe)和工作线程之间进行基本通信。

注意:准确地说,允许在使用相同存储分区的浏览上下文之间进行通信。存储首先根据顶级站点进行分区——例如,如果您在一个打开的页面(位于a.com)中嵌入了一个来自b.com的iframe,以及另一个打开到b.com的页面,那么该iframe无法与第二个页面通信,即使它们在技术上是同源的。但是,如果第一个页面也位于b.com上,则该iframe可以与第二个页面通信。

通过创建BroadcastChannel对象,您可以接收发送到它的任何消息。您无需维护要与其通信的框架或工作线程的引用:它们可以通过使用相同的名称构造自己的BroadcastChannel来“订阅”特定通道,并在所有通道之间进行双向通信。

The principle of the Broadcast Channel API

Broadcast Channel 接口

创建或加入通道

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

js
// Connection to a broadcast channel
const bc = new BroadcastChannel("test_channel");

发送消息

只需在创建的BroadcastChannel对象上调用postMessage()方法即可,该方法将任何对象作为参数。一个示例字符串消息

js
// Example of sending of a very simple message
bc.postMessage("This is a test message.");

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

API 不会将任何语义与消息关联,因此代码需要知道期望哪种消息以及如何处理它们。

接收消息

发布消息时,会将message事件分派到连接到此通道的每个BroadcastChannel对象。可以使用onmessage事件处理程序为该事件运行函数

js
// A handler that only logs the event to the console:
bc.onmessage = (event) => {
  console.log(event);
};

断开通道连接

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

js
// Disconnect the channel
bc.close();

结论

广播通道 API 的自包含接口允许跨上下文通信。它可用于检测同一来源中其他选项卡中的用户操作,例如用户登录或注销时。

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

接口

BroadcastChannel

表示任何给定来源浏览上下文都可以订阅的命名通道。

规范

规范
HTML 标准
# broadcasting-to-other-browsing-contexts

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅