Javascript[33天] 不同窗口或iframe通信之Broadcast Channel API

0

[33天] 不同窗口或iframe通信之Broadcast Channel API

Broadcast Channel PostMessage 跨域通信 同源能信 阅读:971 时间:2022年06月18日

前言 目前现代浏览器(支持最新ES标准)前端通信有PostMessage和Boradcast Channel两种消息机制。这里介绍Broadcast Channel API Broadcast Channel API 可以实现同 源 下浏览器不同窗口,Tab 页...

前言

目前现代浏览器(支持最新ES标准)前端通信有PostMessageBoradcast Channel两种消息机制。这里介绍Broadcast Channel API

Broadcast Channel API 可以实现同 源 下浏览器不同窗口,Tab 页,frame 或者 iframe 下的 浏览器上下文 (通常是同一个网站下不同的页面) 之间的简单通讯。

通过创建一个监听某个频道下的 BroadcastChannel 对象,你可以接收发送给该频道的所有消息。一个有意思的点是,你不需要再维护需要通信的 iframe 或 worker 的索引。它们可以通过构造 BroadcastChannel 来简单地“订阅”特定频道,并在它们之间进行全双工(双向)通信。

image.png

Broadcast Channel 接口

创建或加入某个频道

参数为频道名称

const bc = new BroadcastChannel('test_channel');

通过创建一个 BroadcastChannel 对象,一个客户端就加入了某个指定的频道。只需要向 构造函数 传入一个参数:频道名称。如果这是首次连接到该广播频道,相应资源会自动被创建。

 

发送消息

bc.postMessage('This is a test message.')

不只是 DOMString,任意类型的对象都可以被发送

 

接收消息

bc.onmessage = function (ev) { console.log(ev); }

当消息被发送之后,所有连接到该频道的 BroadcastChannel 对象上都会触发 message 事件

bc.addEventListener('message', ev => {
  // do sth
})

与频道断开连接

bc.close()

通过调用 BroadcastChannel 对象的 close() 方法,可以离开频道。这将断开该对象和其关联的频道之间的联系,并允许它被垃圾回收

该API必须同源

Broadcast Channel API内部包含了跨上下文通讯的接口。它可用于检测同源网站环境中其他浏览器选项卡下的用户操作。没有定义消息传输协议,故不同上下文中的不同文档需要自己实现它:规范没有对此提出协议或要求。

 

与PostMessage的区别

它与postMessage的区别就是:BroadcastChannel只能用于同源的页面之间进行通信,而postMessage却可以用于任何的页面之间的通信,换句话说,BroadcastChannel可以认为是postMessage的一个实例,它承担了postMessage的一个方面的功能。

window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为 https),端口号(443 为 https 的默认值),以及主机  (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。

同源的简单通信BroadcastChannel更为简单方便。

跨域的通信可使用PostMessage。

关于PostMessage:

https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage

 

 

参考资料:

https://developer.mozilla.org/zh-CN/docs/Web/API/Broadcast_Channel_API

发表评论说说你的看法吧

精品模板蓝瞳原创精品网站模板

^