JavaScript由于同源策略的限制,跨域通信一直是棘手的問題。當然解決方案也有很多:
- 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”方法。
發送消息的”postMessage”方法
向外界窗口發送消息:
otherWindow.postMessage(message, targetOrigin);
otherWindow:?指目標窗口,也就是給哪個window發消息,是 window.frames 屬性的成員或者由 window.open 方法創建的窗口參數說明:
- message:?是要發送的消息,類型為 String、Object (IE8、9 不支持)
- targetOrigin:?是限定消息接收范圍,不限制請使用 ‘*’
接受信息的”message”事件
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 iewindow.attachEvent('onmessage', onmessage);}
回調函數第一個參數接收 Event 對象,有三個常用屬性:- data:?消息
- origin:?消息來源地址
- source:?源 DOMWindow 對象
看一個簡單的來自網上的demo:http://www.css88.com/demo/postmessage/
- ie8,ie9下傳遞的數據類型值支持字符串類型,不過可以使用用JSON對象和字符串之間的相互轉換來解決這個問題;
- ie6,ie7需要寫兼容方案,個人認為window.name比較靠譜;
參考網址:
http://js8.in/752.html
http://www.36ria.com/3890
http://www.planeart.cn/?post_type=post&p=1620
聲明: 本文采用 BY-NC-SA 協議進行授權 | WEB前端開發
轉載請注明轉自《使用window.postMessage實現跨域通信》