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 相关文章推荐
基于jquery实现拆分姓名的方法(纯JS版)
May 08 Javascript
JS中的prototype与面向对象的实例讲解
May 22 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
Dec 28 Javascript
Node.js实现批量去除BOM文件头
Dec 20 Javascript
ECMAScript 5中的属性描述符详解
Mar 02 Javascript
Javascript函数式编程简单介绍
Oct 11 Javascript
React组件之间的通信的实例代码
Jun 27 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
Jun 14 Javascript
在vue2.0中引用element-ui组件库的方法
Jun 21 Javascript
微信小程序实现自上而下字幕滚动
Jul 14 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
Jul 23 Javascript
jQuery实现查看图片功能
Dec 01 jQuery
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
递归列出所有文件和目录
2006/10/09 PHP
cache_lite试用
2007/02/14 PHP
可以在线执行PHP代码包装修正版
2008/03/15 PHP
php中导出数据到excel时数字变为科学计数的解决方法
2013/02/03 PHP
php获取301跳转URL简单实例
2013/12/16 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
php+mysql实现的无限分类方法类定义与使用示例
2020/05/27 PHP
JavaScript 函数式编程的原理
2009/10/16 Javascript
jQuery.getScript加载同域JS的代码
2012/02/13 Javascript
通过JS获取用户本地图片路径并显示的代码
2012/02/16 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
2013/01/09 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
jQuery Ajax()方法使用指南
2014/11/19 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
利用python修改json文件的value方法
2018/12/31 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
2020/02/17 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
Python多线程正确用法实例解析
2020/05/30 Python
python各种excel写入方式的速度对比
2020/11/10 Python
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
售后主管岗位职责
2013/12/08 职场文书
说谎欺骗人检讨书300字
2014/11/18 职场文书
小学老师对学生的评语
2014/12/29 职场文书
全陪导游词
2015/02/04 职场文书
学校重阳节活动总结
2015/03/24 职场文书
博士生专家推荐信
2015/03/25 职场文书
幼儿园教师师德师风承诺书
2015/04/28 职场文书
企业法律事务工作总结
2015/08/11 职场文书
旅行社计调工作总结
2015/08/12 职场文书
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
2021/09/25 Java/Android