源:協議、端口號(https默認值433)、主機域名(document.domain)
做用:向目標窗口派發MessageEvent消息(四個屬性)
兼容參考html
MessageEvent四個屬性:
1.message(類型)
2.data(window.postMessage的第一個參數)
3.origin(調用postMessage時頁面的當前狀態)
4.source(調用postMessage的窗口信息)html5
otherWindow.postMessage(message, targetOrigin, [transfer]);跨域
otherWindow: 其餘窗口(目標窗口)的一個引用,好比iframe的contentWindow屬性、執行window.open返回的窗口對象、或者是命名過或數值索引的window.frames
(如父窗口向內嵌的iframe窗口發送信息)
message :信息內容,低版本瀏覽器只支持字符串,高版本能夠各類數據都行
targetOrigin :目標窗口的源,能夠是字符串*表示無限制,或URI,須要協議端口號和主機都匹配纔會發送
transfer:參考MDN瀏覽器
window.addEventListener("message", function(MessageEvent){ var origin = event.origin || event.originalEvent.origin; .... }, false);
父窗口:dom
<!--我是父窗口--> <div class="parent" > <iframe src="子窗口連接" id="iframe"></iframe> </div> <script> //監聽子窗口信息 window.addEventListener('message',function(event){ ... }) //父窗口給子窗口發消息, document.getElementByID('iframe').contentWindow.postMessage(msg,'子窗口源'); </script>
子窗口post
<!--我是子窗口--> <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.frameElementcode