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 相关文章推荐
JavaScript子窗口ModalDialog中操作父窗口对像
Dec 11 Javascript
首页图片漂浮效果示例代码
Jun 05 Javascript
node.js中的http.response.getHeader方法使用说明
Dec 14 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
Sep 24 Javascript
Angular.JS中的指令引用template与指令当做属性详解
Mar 30 Javascript
AngularJS1.X学习笔记2-数据绑定详解
Apr 01 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
Jul 21 Javascript
详解vue 项目白屏解决方案
Oct 31 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
Sep 18 Javascript
javaScript实现一个队列的方法
Jul 14 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
Oct 29 Javascript
vue组件是如何解析及渲染的?
Jan 13 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
PHP的范围解析操作符(::)的含义分析说明
2011/07/03 PHP
sql注入与转义的php函数代码
2013/06/17 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
关于laravel 日志写入失败问题汇总
2019/10/17 PHP
jquery插件之easing使用
2010/08/19 Javascript
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
js正文内容高亮效果的实现方法
2013/06/30 Javascript
JavaScript获取FCK编辑器信息的具体方法
2013/07/12 Javascript
深入浅析AngularJS和DataModel
2016/02/16 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
2019/05/30 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
十分钟教你上手ES2020新特性
2020/02/12 Javascript
Python爬取国外天气预报网站的方法
2015/07/10 Python
使用Selenium破解新浪微博的四宫格验证码
2018/10/19 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
学会迭代器设计模式,帮你大幅提升python性能
2021/01/03 Python
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
写给女生的道歉信
2014/01/08 职场文书
食品销售计划书
2014/04/26 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
创先争优宣传标语
2014/10/08 职场文书
教师党员整改措施
2014/10/24 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
JS数组去重详情
2021/11/07 Javascript