JavaScript使用HTML5的window.postMessage實現(xiàn)跨域通信例子
JavaScript由于同源策略的限制,跨域通信一直是棘手的問題。當(dāng)然解決方案也有很多:
1.document.domain+iframe的設(shè)置,應(yīng)用于主域相同而子域不同;
2.利用iframe和location.hash,數(shù)據(jù)直接暴露在了url中,數(shù)據(jù)容量和類型都有限
3.Flash LocalConnection, 對象可在一個 SWF 文件中或多個 SWF 文件間進行通信, 只要
在同一客戶端就行,跨應(yīng)用程序, 可以跨域。
window.name 保存數(shù)據(jù)以及跨域 iframe 靜態(tài)代理動態(tài)傳輸方案,充分的運用了window.name因為頁面的url改變而name不改變的特性。
各種方案網(wǎng)上都有很多實例代碼,大家可以自己搜索一下。
html5中最炫酷的API之一:就是 跨文檔消息傳輸Cross Document Messaging。高級瀏覽器Internet Explorer 8+, chrome,F(xiàn)irefox , Opera 和 Safari 都將支持這個功能。這個功能實現(xiàn)也非常簡單主要包括接受信息的”message”事件和發(fā)送消息的”postMessage”方法。
發(fā)送消息的”postMessage”方法
向外界窗口發(fā)送消息:
otherWindow: 指目標(biāo)窗口,也就是給哪個window發(fā)消息,是 window.frames 屬性的成員或者由 window.open 方法創(chuàng)建的窗口
參數(shù)說明:
1.message: 是要發(fā)送的消息,類型為 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);
}
回調(diào)函數(shù)第一個參數(shù)接收 Event 對象,有三個常用屬性:
1.data: 消息
2.origin: 消息來源地址
3.source: 源 DOMWindow 對象
當(dāng)然postmessage也有一些不足的地方:
1.ie8,ie9下傳遞的數(shù)據(jù)類型值支持字符串類型,不過可以使用用 JSON對象和字符串之間的相互轉(zhuǎn)換 來解決這個問題;
2.ie6,ie7需要寫兼容方案,個人認為window.name比較靠譜;
相關(guān)文章
解決webpack無法通過IP地址訪問localhost的問題
下面小編就為大家分享一篇解決webpack無法通過IP地址訪問localhost的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02
寫出更好的JavaScript程序之undefined篇(中)
前一篇我介紹了幾種廣為使用的利用undefined這個概念值的辦法,這一篇我會介紹一些不太常見的辦法,其中還包括一個很巧妙的,我個人覺得很值得推廣的辦法。2009-11-11
詳解js中構(gòu)造流程圖的核心技術(shù)JsPlumb

