目前现代浏览器(支持最新ES标准)前端通信有PostMessage
和Boradcast Channel
两种消息机制。这里介绍Broadcast Channel API
Broadcast Channel API 可以实现同 源 下浏览器不同窗口,Tab 页,frame 或者 iframe 下的 浏览器上下文 (通常是同一个网站下不同的页面) 之间的简单通讯。
通过创建一个监听某个频道下的 BroadcastChannel 对象,你可以接收发送给该频道的所有消息。一个有意思的点是,你不需要再维护需要通信的 iframe 或 worker 的索引。它们可以通过构造 BroadcastChannel 来简单地“订阅”特定频道,并在它们之间进行全双工(双向)通信。
参数为频道名称
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() 方法,可以离开频道。这将断开该对象和其关联的频道之间的联系,并允许它被垃圾回收
Broadcast Channel API内部包含了跨上下文通讯的接口。它可用于检测同源网站环境中其他浏览器选项卡下的用户操作。没有定义消息传输协议,故不同上下文中的不同文档需要自己实现它:规范没有对此提出协议或要求。
它与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