JavaScript实现的双向跨域插件分享


Posted in Javascript onJanuary 31, 2015

由于浏览器(同源策略)限制,JavaScript 跨域的问题,一直是一个颇为棘手的问题。HTML5 提供了跨文档消息传输的功能,在网页文档之间互相接收与发送信息。使用这个功能,不仅同源(域 + 端口号)的 Web 网页之间可以互相通信,还可以在两个不同域名之间实现跨域通信。

跨文档消息传输Cross Document Messaging提供了postMessage方法在不同网页文档之间互相传递数据,支持实时消息传递。现在很多浏览器都将支持这个功能,比如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.3water.com/201501/other/jcrossdomain_v2.rar,版本v2

javascript跨域插件jcrossdomain.js

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

父网页中调用方法:

//自定义回调函数

var cb = function(msg){

  alert("get msg:" + msg);

};
//初始化,载入回调函数和 iframe 的id

jCrossDomain.initParent(cb, 'iframeA');
//发消息

jCrossDomain.sendMessage('hello, child');

子网页中调用方法:

//自定义回调函数

var cb = function(msg){

  alert("get msg:" + msg);

};
//初始化,载入回调函数

jCrossDomain.initChild(cb);
//发消息

jCrossDomain.sendMessage('hello, parent');

模拟测试小提示:
为了实现不同域之间的通信,可以在操作系统的 hosts 文件添加两个域名,进行模拟。

hosts 文件中添加两个不同的域名
127.0.0.1  parent.com
127.0.0.1  child.com

程序猿的进化过程:

JavaScript实现的双向跨域插件分享

Javascript 相关文章推荐
js文字滚动停顿效果代码
Jun 28 Javascript
javascript高亮效果的二种实现方法
Sep 14 Javascript
jQuery之$(document).ready()使用介绍
Apr 05 Javascript
AngularJS HTML DOM详解及示例代码
Aug 17 Javascript
纯JS代码实现隔行变色鼠标移入高亮
Nov 23 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
Jan 30 Javascript
动态创建Angular组件实现popup弹窗功能
Sep 15 Javascript
基于bootstrap写的一点localStorage本地储存
Nov 21 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
Apr 12 Javascript
js使用Promise实现简单的Ajax缓存
Nov 14 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
Mar 10 Javascript
vue使用节流函数的踩坑实例指南
May 20 Vue.js
JavaScript判断变量是否为空的自定义函数分享
Jan 31 #Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
Dec 24 #Javascript
js判断登录与否并确定跳转页面的方法
Jan 30 #Javascript
jQuery知识点整理
Jan 30 #Javascript
浅谈jquery回调函数callback的使用
Jan 30 #Javascript
jQuery修改class属性和CSS样式整理
Jan 30 #Javascript
javascript中AJAX用法实例分析
Jan 30 #Javascript
You might like
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
PHP设计模式之模板模式定义与用法详解
2018/12/20 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
jQuery动态改变图片显示大小(修改版)的实现思路及代码
2013/12/24 Javascript
jQuery多项选项卡的实现思路附样式及代码
2014/06/03 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
Javascript之面向对象--方法
2016/12/02 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
详解用vue-cli来搭建vue项目和webpack
2017/04/20 Javascript
Vue render深入开发讲解
2018/04/13 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
详解Vue中CSS样式穿透问题
2019/09/12 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
python斐波那契数列的计算方法
2018/09/27 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
opencv python在视屏上截图功能的实现
2020/03/05 Python
Python新手学习标准库模块命名
2020/05/29 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
森海塞尔美国官网:Sennheiser耳机与耳麦
2017/07/19 全球购物
《狼和小羊》教学反思
2014/04/20 职场文书
设计大赛策划方案
2014/06/13 职场文书
授权委托书(法人单位用)
2014/09/29 职场文书
2015年仓库工作总结
2015/04/09 职场文书
2015年材料员工作总结
2015/04/30 职场文书
导游词之台湾安平古堡
2019/12/25 职场文书