使用postMessage在不同iframe间跨域传递消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用postMessage在不同iframe间跨域传递消息相关的知识,希望对你有一定的参考价值。

iframe同源策略

如果父窗口访问一个不同域名的子窗口就会报错:
Uncaught DOMException: Blocked a frame with origin "xxx" from accessing a cross-origin frame.
如何解决呢?一个简单的思路就是,既然是因为不同源,那么再建一个同源的窗口不久可以了吗?一个同源的子窗口能读取父窗口无法访问的子窗口的内容,然后通过postMessage传递给父窗口就可以了。

//http://app1.test.local/frame_exec.html
window.onload=function(){
    var h1_content=parent.window.frames[‘app1‘].document.getElementById(‘frameTitle‘).innerHTML;
    parent.postMessage({name:‘tom‘,content:h1_content},‘http://app2.test.local‘);
};
<!--http://app1.test.local/iframe.html-->
<h1 id="frameTitle">This is a content in cross domain iframe!</h1>
<!--http://app2.test.local/main_frame.html-->
<iframe name="app1" id="app1" src="http://app1.test.local/iframe.html"></iframe>
<iframe name="app1Exec" id="app1Exec" src="http://app1.test.local/iframe_exec.html"></iframe>
<script>
window.onload=function(){
//Uncaught DOMException: Blocked a frame with origin "http://app2.test.local" from accessing a cross-origin frame.      
    console.info(document.getElementById(‘app1‘).contentWindow.document.getElementById(‘frameTitle‘));
};
window.addEventListener(‘message‘,function(e){
//{name: "tom", content: "This is a content in cross domain iframe!"}
    console.info(e.data);
},false);
</script>

以上是关于使用postMessage在不同iframe间跨域传递消息的主要内容,如果未能解决你的问题,请参考以下文章

在IFrame中使用postMessage跨域

使用 postMessage + iframe 实现跨域通信

使用 iframe + postMessage 实现跨域通信

使用 jquery.ba-postmessage 的 iframe 动态高度跨域

使用window.postMessage进行iframe跨域数据通信

解决Iframe跨域高度自适应,利用window.postMessage()实现跨域消息传递页面高度(JavaScript)