postMessage实现跨源通信

270 阅读1分钟

PostMessage 是 html5 新引进的一个可跨源通信 api,你可以通过这个 api,让主页面和任意 frame 类页面或 window.open 打开的页面进行双向通信。
语法: otherWindow.postMessage(message, targetOrigin, [transfer]);
otherWindow
其他窗口的一个引用,比如 iframe 的 contentWindow 属性、执行 window.open 返回的窗口对象、或者是命名过或数值索引的 window.frames。
message
要发送的数据。它将会被结构化克隆算法序列化,所以无需自己序列化(部分低版本浏览器只支持字符串,所以发送的数据最好用JSON.stringify() 序列化)。
targetOrigin
通过 targetOrigin 属性来指定哪些窗口能接收到消息事件,其值可以是字符串“*”(表示无限制)或者一个 URI(如果要指定和当前窗口同源的话可设置为"/")。在发送消息的时候,如果目标窗口的协议、主机地址或端口号这三者的任意一项不匹配 targetOrigin 提供的值,那么消息就不会发送。

一.子向父通信

子:用postMessage传递信息
父:监听用message

发送方(子):window.parent.postMessage('11','*')
接收方(父):window.addEventlistener('message',(e)=>{ console.log(e.data) })

二.父向子通信

父:用postMessage
子:监听用message

注:父向子传递用postMessage时,源需要写成子的源(也就是子页面协议+主机号+商品)

发送方(父):let myFrame=document.getElementById('myFrame')
myFrame.contentWindow.postMessage({data:'parent'},'http://localhost:3001')
接收方(子):window.addEventlistener('message',(e)=>{ console.log(e.data) })

三.其他用法

image.png

image.png

image.png

注:所有主流浏览器(包括IE8)都支持。