广播通道 API
注意:此功能在Web Workers中可用。
广播通道 API允许在同一来源上的浏览上下文(即,窗口、选项卡、框架或iframe)和工作线程之间进行基本通信。
注意:准确地说,允许在使用相同存储分区的浏览上下文之间进行通信。存储首先根据顶级站点进行分区——例如,如果您在一个打开的页面(位于a.com
)中嵌入了一个来自b.com
的iframe,以及另一个打开到b.com
的页面,那么该iframe无法与第二个页面通信,即使它们在技术上是同源的。但是,如果第一个页面也位于b.com
上,则该iframe可以与第二个页面通信。
通过创建BroadcastChannel
对象,您可以接收发送到它的任何消息。您无需维护要与其通信的框架或工作线程的引用:它们可以通过使用相同的名称构造自己的BroadcastChannel
来“订阅”特定通道,并在所有通道之间进行双向通信。
Broadcast Channel 接口
创建或加入通道
客户端通过创建BroadcastChannel
对象加入广播通道。其构造函数采用一个参数:通道的名称。如果它是第一个连接到该广播通道名称的客户端,则会创建底层通道。
// Connection to a broadcast channel
const bc = new BroadcastChannel("test_channel");
发送消息
只需在创建的BroadcastChannel
对象上调用postMessage()
方法即可,该方法将任何对象作为参数。一个示例字符串消息
// Example of sending of a very simple message
bc.postMessage("This is a test message.");
发送到通道的数据使用结构化克隆算法进行序列化。这意味着您可以安全地发送各种数据对象,而无需自己进行序列化。
API 不会将任何语义与消息关联,因此代码需要知道期望哪种消息以及如何处理它们。
接收消息
发布消息时,会将message
事件分派到连接到此通道的每个BroadcastChannel
对象。可以使用onmessage
事件处理程序为该事件运行函数
// A handler that only logs the event to the console:
bc.onmessage = (event) => {
console.log(event);
};
断开通道连接
要离开通道,请在对象上调用close()
方法。这会将对象从底层通道断开连接,允许垃圾回收。
// Disconnect the channel
bc.close();
结论
广播通道 API 的自包含接口允许跨上下文通信。它可用于检测同一来源中其他选项卡中的用户操作,例如用户登录或注销时。
消息传递协议未定义,不同的浏览上下文需要自行实现;规范中没有协商或要求。
接口
规范
规范 |
---|
HTML 标准 # broadcasting-to-other-browsing-contexts |
浏览器兼容性
BCD 表格仅在浏览器中加载
另请参阅
BroadcastChannel
,实现它的接口。