Broadcast Channel API --- 同源tab通讯

88 阅读2分钟

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

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

备注: 确切地说,允许使用相同的存储分区的浏览上下文之间进行通信。首先根据顶级网站对存储空间进行分区,例如,如果你在 a.com 处打开了一个页面,其中嵌入了 b.com 的 iframe,而另一个页面打开的页面是 b.com,则 iframe 无法与第二个页面通信,尽管它们在技术上是同源的。但是,如果第一个页面也位于 b.com 上,则 iframe 可以与第二个页面通信。

创建或加入某个频道

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

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

发送消息

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

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

可以安全地发送各种各样的数据对象,而无需自己对其进行序列化。

接收消息

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

// 仅将事件记录到控制台的处理器:
bc.onmessage = (event) => {
  console.log(event);
  // 应用情况举例
  // 1.同一个系统,打开很多tab页签,从一个页签退出登录,其他页签可以接收到消息,跳转登录页。而不用在其他页签还要调用一个接口,后端返回token过期,再跳转登录页。节省了一个步骤。
  // 2. 同一个系统,可能是由多个代码库部署而成(可能因为技术栈原因、也可能单纯的是有的页面要做服务端渲染,单独开一个代码库方便管理),在这种情况下可使用Broadcast Channel API实现简单通讯。
};

断开频道

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

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