由于瀏覽器(同源策略)限制,JavaScript 跨域的問題,一直是一個頗為棘手的問題。HTML5 提供了跨文檔消息傳輸的功能,在網頁文檔之間互相接收與發送信息。使用這個功能,不僅同源(域 + 端口號)的 Web 網頁之間可以互相通信,還可以在兩個不同域名之間實現跨域通信。
跨文檔消息傳輸Cross Document Messaging提供了postMessage方法在不同網頁文檔之間互相傳遞數據,支持實時消息傳遞?,F在很多瀏覽器都將支持這個功能,比如Google Chrome 2.0+、Internet Explorer 8.0+、Firefox 3.0+、Opera 9.6+、Safari 4.0+等
那么,IE6、IE7等不支持 HTML5的瀏覽器怎么辦?
可以使用window.name方法,因為window.name的修改不涉及跨域問題,雖然使用起來不是特別理想,但效果還可以接受。
但是,我們總不能每次涉及到跨域都去寫一遍window.postMessage、window.addEventListener、window.name等等這些內容吧。
為此,我把這整個跨域過程抽象出來,封裝成一個JavaScript 插件,解決雙向跨域問題,實現不同網頁文檔之間的實時通信,可以在兩個不同域名之間實現跨域通信。
demo下載地址:http://xiazai.VeVB.COm/201501/other/jcrossdomain_v2.rar,版本v2
javascript跨域插件jcrossdomain.js
var jcd = {
initParent : function(callback, iframeId){
_jcd.init(callback, document.getElementById(iframeId).contentWindow);
},
initChild : function(callback){
_jcd.init(callback, win.parent);
},
sendMessage : function(data){
_jcd.msg(data);
}
};
win.jCrossDomain = jcd;
})(window);
父網頁中調用方法:
//初始化,載入回調函數和 iframe 的id
jCrossDomain.initParent(cb, 'iframeA');
//發消息
jCrossDomain.sendMessage('hello, child');
子網頁中調用方法:
//初始化,載入回調函數
jCrossDomain.initChild(cb);
//發消息
jCrossDomain.sendMessage('hello, parent');
模擬測試小提示:
為了實現不同域之間的通信,可以在操作系統的 hosts 文件添加兩個域名,進行模擬。
hosts 文件中添加兩個不同的域名
127.0.0.1 parent.com
127.0.0.1 child.com
程序猿的進化過程:
新聞熱點
疑難解答