使用window.postMessage實現跨域通訊

JavaScript因爲同源策略的限制,跨域通訊一直是棘手的問題。固然解決方案也有不少:html

  • document.domain+iframe的設置,應用於主域相同而子域不一樣;
  • 利用iframe和location.hash,數據直接暴露在了url中,數據容量和類型都有限
  • Flash LocalConnection, 對象可在一個 SWF 文件中或多個 SWF 文件間進行通訊, 只要在同一客戶端就行,跨應用程序, 能夠跨域。
  • window.name 保存數據以及跨域 iframe 靜態代理動態傳輸方案,充分的運用了window.name由於頁面的url改變而name不改變的特性。

各類方案網上都有不少實例代碼,你們能夠本身搜索一下。 
html5中最炫酷的API之一:就是   跨文檔消息傳輸Cross Document Messaging 。高級瀏覽器Internet Explorer 8+, chrome,Firefox , Opera  和 Safari 都將支持這個功能。這個功能實現也很是簡單主要包括接受信息的」message」事件和發送消息的」postMessage」方法。
html5

發送消息的」postMessage」方法web

向外界窗口發送消息:chrome

otherWindow.postMessage(message, targetOrigin);

otherWindow:   指目標窗口,也就是給哪一個window發消息,是 window.frames 屬性的成員或者由 window.open 方法建立的窗口跨域

參數說明:瀏覽器

  • message:   是要發送的消息,類型爲 String、Object (IE八、9 不支持)
  • targetOrigin:   是限定消息接收範圍,不限制請使用 ‘*’

接受信息的」message」事件app

var onmessage = function (event) {  var data = event.data;  var origin = event.origin;  //do someing }; if (typeof window.addEventListener != 'undefined') {  window.addEventListener('message', onmessage, false); } else if (typeof window.attachEvent != 'undefined') {  //for ie  window.attachEvent('onmessage', onmessage); }

回調函數第一個參數接收 Event 對象,有三個經常使用屬性:dom

  • data:   消息
  • origin:   消息來源地址
  • source:   源 DOMWindow 對象
相關文章
相關標籤/搜索