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 学习笔记 选择器之三
Jul 23 Javascript
javascript面向对象快速入门实例
Jan 13 Javascript
JavaScript数据结构与算法之栈详解
Mar 12 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
Oct 15 Javascript
百度地图API之百度地图退拽标记点获取经纬度的实现代码
Jan 12 Javascript
前端自动化开发之Node.js的环境搭建教程
Apr 01 Javascript
sublime text配置node.js调试(图文教程)
Nov 23 Javascript
JS实现网页抢购功能(触发,终止脚本)
Nov 27 Javascript
基于JavaScript实现抽奖系统
Jan 16 Javascript
微信小程序分包加载代码实现方法详解
Sep 23 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
Jul 28 Javascript
36个正则表达式(开发效率提高80%)
Nov 17 Javascript
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
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
2014/10/26 PHP
php 5.6版本中编写一个PHP扩展的简单示例
2015/01/20 PHP
PHP可变函数学习小结
2015/11/29 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
Laravel框架实现多个视图共享相同数据的方法详解
2019/07/09 PHP
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
原生的html元素选择器类似jquery选择器
2014/10/15 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
nodejs如何获取时间戳与时间差
2016/08/03 NodeJs
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
深入学习jQuery中的data()
2016/12/22 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
深入理解Python 代码优化详解
2014/10/27 Python
python利用urllib和urllib2访问http的GET/POST详解
2017/09/27 Python
python try except 捕获所有异常的实例
2018/10/18 Python
会走动的图形html5时钟示例
2014/04/27 HTML / CSS
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
幼儿园门卫制度
2014/01/29 职场文书
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
监督检查工作方案
2014/05/28 职场文书
司法助理专业自荐书
2014/06/13 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
高三语文复习计划
2015/01/19 职场文书
工艺技术员岗位职责
2015/02/04 职场文书
五一劳动节慰问信
2015/02/14 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang