跨域通信--Window.postMessage()


一、跨源通信概述

源:協議、端口號(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

參考:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM