跨页面通信

等风来 / 2023-08-15 / 原文

1. 父子页面通信

父子页面有两种,iframe嵌套的和window.open打开的。window.open打开的页面,在窗口模式时,被打开的页面就是当前页面的子页面,
tab模式时,只是形式不一样,也是子页面,可以通过window.opener来访问父页面。

iframe的通信方式: window.name, window.hash, postMessage

window.open的通信方式: postMessage

其中postMessage通信是最简单实现双向通信的方式。

2. 两个独立页面通信

两个同域的独立页面通信可以使用localStorage,兄弟页面监听storage事件就行了。

两个跨域的独立页面可以使用一个birdge页面当做桥梁,做同域通信,两个页面分别用iframe嵌套它,用postMessage做跨域通信,就实现了两个跨域页面的通信。

具体如下图
             postMessage                                            storage                                                postMessage
tab A <-------------------> iframe A [birdge.html] <-------------> iframe B [birdge.html] <------------------> tab B

3. 同域通信的新方法BroadcastChannel

BroadcastChannel 支持同源的 不同浏览器窗口,Tab 页,frame 或者 iframe 下的不同文档之间相互通信。

通过触发一个 message 事件,消息可以广播到所有监听了该频道的 BroadcastChannel 对象。

支持多种类型文档之间的通信,面对多通信有优势。

浏览器兼容性  chrome 54 safari 15.4,safari上拉胯,兼容性尚可