国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript實(shí)現(xiàn)的雙向跨域插件分享

2019-11-20 13:16:09
字體:
供稿:網(wǎng)友

由于瀏覽器(同源策略)限制,JavaScript 跨域的問題,一直是一個(gè)頗為棘手的問題。HTML5 提供了跨文檔消息傳輸?shù)墓δ?,在網(wǎng)頁文檔之間互相接收與發(fā)送信息。使用這個(gè)功能,不僅同源(域 + 端口號(hào))的 Web 網(wǎng)頁之間可以互相通信,還可以在兩個(gè)不同域名之間實(shí)現(xiàn)跨域通信。

跨文檔消息傳輸Cross Document Messaging提供了postMessage方法在不同網(wǎng)頁文檔之間互相傳遞數(shù)據(jù),支持實(shí)時(shí)消息傳遞?,F(xiàn)在很多瀏覽器都將支持這個(gè)功能,比如Google Chrome 2.0+、Internet Explorer 8.0+、Firefox 3.0+、Opera 9.6+、Safari 4.0+等

那么,IE6、IE7等不支持 HTML5的瀏覽器怎么辦?

可以使用window.name方法,因?yàn)閣indow.name的修改不涉及跨域問題,雖然使用起來不是特別理想,但效果還可以接受。
但是,我們總不能每次涉及到跨域都去寫一遍window.postMessage、window.addEventListener、window.name等等這些內(nèi)容吧。

為此,我把這整個(gè)跨域過程抽象出來,封裝成一個(gè)JavaScript 插件,解決雙向跨域問題,實(shí)現(xiàn)不同網(wǎng)頁文檔之間的實(shí)時(shí)通信,可以在兩個(gè)不同域名之間實(shí)現(xiàn)跨域通信。

demo下載地址:http://xiazai.VeVB.COm/201501/other/jcrossdomain_v2.rar,版本v2

javascript跨域插件jcrossdomain.js

復(fù)制代碼 代碼如下:

(function (win){
  /**
   * 沒有開花的樹
   * 2013/12/07 17:12
   */
  var _jcd = {
    isInited : false,
    elmt : false,
    hash : '',
    delims : ',',
    rand : function(){
      return (new Date).getTime()
    },
    msg : function(){
      alert('Warning: You must call init function at first');
    },
    init : function(callback, elmt){
      if(_jcd.isInited == true)
        return;
      _jcd.isInited = true;
      _jcd.elmt = elmt;
      if(win.postMessage){
        //瀏覽器支持 HTML5 postMessage 方法
        if(win.addEventListener){
          //支持火狐、谷歌等瀏覽器
          win.addEventListener("message", function(ev){
            callback.call(win, ev.data);
          },false);
        }else if(win.attachEvent){
          //支持IE瀏覽器
          win.attachEvent("onmessage", function(ev){
            callback.call(win, ev.data);
          });
        }
        _jcd.msg = function(data){
          _jcd.elmt.postMessage(data, '*');
        }
      }else{
        //瀏覽器不支持 HTML5 postMessage 方法,如IE6、7
        setInterval(function(){
          if (win.name !== _jcd.hash) {
            _jcd.hash = win.name;
            callback.call(win, _jcd.hash.split(_jcd.delims)[1]);
          }
        }, 50);
        _jcd.msg = function(data){
          _jcd.elmt.name = _jcd.rand() + _jcd.delims + data;
        }
      }
    }
  };

  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);

父網(wǎng)頁中調(diào)用方法:

復(fù)制代碼 代碼如下:

//自定義回調(diào)函數(shù)
var cb = function(msg){
  alert("get msg:" + msg);
};

//初始化,載入回調(diào)函數(shù)和 iframe 的id
jCrossDomain.initParent(cb, 'iframeA');

//發(fā)消息
jCrossDomain.sendMessage('hello, child');

子網(wǎng)頁中調(diào)用方法:

復(fù)制代碼 代碼如下:

//自定義回調(diào)函數(shù)
var cb = function(msg){
  alert("get msg:" + msg);
};

//初始化,載入回調(diào)函數(shù)
jCrossDomain.initChild(cb);

//發(fā)消息
jCrossDomain.sendMessage('hello, parent');

模擬測試小提示:
為了實(shí)現(xiàn)不同域之間的通信,可以在操作系統(tǒng)的 hosts 文件添加兩個(gè)域名,進(jìn)行模擬。

hosts 文件中添加兩個(gè)不同的域名
127.0.0.1  parent.com
127.0.0.1  child.com

程序猿的進(jìn)化過程:

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 丽水市| 平利县| 鄯善县| 大足县| 米脂县| 子长县| 泾川县| 韩城市| 定远县| 高雄县| 文成县| 刚察县| 无为县| 海门市| 岑溪市| 新闻| 克什克腾旗| 阿瓦提县| 喀什市| 荔波县| 秭归县| 伊春市| 朝阳市| 定结县| 菏泽市| 若羌县| 洛浦县| 西丰县| 江山市| 蕲春县| 台东县| 贡嘎县| 昭平县| 云和县| 手游| 昌江| 永春县| 康定县| 宁安市| 海伦市| 郴州市|