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 相关文章推荐
iphone safari不支持position fixed的解决方法
May 04 Javascript
js中top/parent/frame概述及案例应用
Feb 06 Javascript
php的文件上传入门教程(实例讲解)
Apr 10 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
Aug 25 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
Oct 20 Javascript
js窗口关闭提示信息(兼容IE和firefox)
Oct 23 Javascript
javascript中new关键字详解
Dec 14 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
Dec 29 Javascript
js中let和var定义变量的区别
Feb 08 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
Mar 09 Javascript
layui 动态设置checbox 选中状态的例子
Sep 02 Javascript
jQuery实现可编辑的表格
Dec 11 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
php在线打包程序源码
2008/07/27 PHP
PHP性能优化 产生高度优化代码
2011/07/22 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
PHP合并静态文件详解
2014/11/14 PHP
PHP解析目录路径的3个函数总结
2014/11/18 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
2019/01/28 PHP
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
2013/04/26 Javascript
把input初始值不写value的具体实现方法
2013/07/04 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
2016/07/11 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
2016/08/01 Javascript
浅析Javascript的自动分号插入(ASI)机制
2016/09/29 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
使用bootstrap插件实现模态框效果
2017/05/10 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
vue组件间通信六种方式(总结篇)
2019/05/15 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
js代码编写无缝轮播图
2020/09/13 Javascript
深入理解Python对Json的解析
2017/02/14 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
pandas分区间,算频率的实例
2019/07/04 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
Baracuta官方网站:Harrington夹克,G9,G4,G10等
2018/03/06 全球购物
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
俄罗斯在线大型超市:ТутПросто
2021/01/08 全球购物
争论的故事教学反思
2014/02/06 职场文书
2014年接待工作总结
2014/11/26 职场文书
《给予树》教学反思
2016/03/03 职场文书
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript