跨域通訊--Window.postMessage()

1、跨源通訊概述

源:協議、端口號(https默認值433)、主機域名(document.domain)
做用:向目標窗口派發MessageEvent消息(四個屬性)
兼容參考html

MessageEvent四個屬性:
1.message(類型)
2.data(window.postMessage的第一個參數)
3.origin(調用postMessage時頁面的當前狀態)
4.source(調用postMessage的窗口信息)html5

2、postMessage語法:

otherWindow.postMessage(message, targetOrigin, [transfer]);跨域

otherWindow: 其餘窗口(目標窗口)的一個引用,好比iframe的contentWindow屬性、執行window.open返回的窗口對象、或者是命名過或數值索引的window.frames
(如父窗口向內嵌的iframe窗口發送信息)
message :信息內容,低版本瀏覽器只支持字符串,高版本能夠各類數據都行
targetOrigin :目標窗口的源,能夠是字符串*表示無限制,或URI,須要協議端口號和主機都匹配纔會發送
transfer:參考MDN瀏覽器

3、接收postMessage發送的信息MessageEvent

window.addEventListener("message", function(MessageEvent){
  var origin = event.origin || event.originalEvent.origin; 
  ....
  }, false);

4、demo--利用iframe嵌套父子窗口通訊

父窗口: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

參考:

MDN:postMessage說明
兼容性
html5 postMessage解決跨域、跨窗口消息傳遞htm

相關文章
相關標籤/搜索