一、跨源通信概述
源:協議、端口號(https默認值433)、主機域名(document.domain)
作用:向目標窗口派發MessageEvent消息(四個屬性)
兼容參考
MessageEvent四個屬性:
1.message(類型)
2.data(window.postMessage的第一個參數)
3.origin(調用postMessage時頁面的當前狀態)
4.source(調用postMessage的窗口信息)
二、postMessage語法:
otherWindow.postMessage(message, targetOrigin, [transfer]);
otherWindow: 其他窗口(目標窗口)的一個引用,比如iframe的contentWindow屬性、執行window.open返回的窗口對象、或者是命名過或數值索引的window.frames
(如父窗口向內嵌的iframe窗口發送信息)
message :信息內容,低版本瀏覽器只支持字符串,高版本可以各種數據都行
targetOrigin :目標窗口的源,可以是字符串*表示無限制,或URI,需要協議端口號和主機都匹配才會發送
transfer:參考MDN
三、接收postMessage發送的信息MessageEvent
window.addEventListener("message", function(MessageEvent){
var origin = event.origin || event.originalEvent.origin;
....
}, false);
四、demo--利用iframe嵌套父子窗口通信
父窗口:
<!--我是父窗口-->
<div class="parent" >
<iframe src="子窗口鏈接" id="iframe"></iframe>
</div>
<script>
//監聽子窗口信息
window.addEventListener('message',function(event){
...
})
//父窗口給子窗口發消息,
document.getElementByID('iframe').contentWindow.postMessage(msg,'子窗口源');
</script>
子窗口
<!--我是子窗口-->
<div class="child"></div>
<script>
//子窗口給父窗口發消息
try {//放到trycatch里面,解決有些手機卡住報錯問題
window.top.postMessage(msg,'父窗口源');
//嵌套一層使用window.top(parent),多層window.frameElement
//使用top而不是window,top指向iframe最頂層窗口
} catch (error) {
}
//監聽父窗口信息
window.addEventListener('message',function(event){
...
})
</script>
注意:
父窗口給子窗口發信息,需要用iframe的contentWindow屬性作為調用主體
子窗口給父窗口發的信息需要使用window.top,多層iframe使用window.frameElement