JavaScript由於同源策略的限制,跨域通訊一直是個棘手的問題。當然解決方案也有很多:
1.document.domain iframe的設置,應用於主域相同而子域不同;
2.利用iframe和location.hash,數據直接暴露在了url中,數據容量和類型都有限
3.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: 指目標視窗,也就是給哪個windowframes 屬性的成員或由window.open 方法建立的視窗
參數說明:
1.message: 是要傳送的訊息,類型為String、Object (IE8、9 不支援)
2.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 ie
window.attachEvent('onmessage', onmessage);
}
回呼函數第一個參數接收Event 對象,有三個常用屬性:
1.data: 訊息
2.origin: 訊息來源位址
3.source: 來源DOMWindow 物件
當然postmessage也有一些不足的地方:
1.ie8,ie9下傳遞的資料型別值支援字串型,不過可以使用用JSON物件和字串之間的相互轉換來解決這個問題;
2.ie6,ie7需要寫相容方案,個人認為window.name比較可靠;