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 Xml增删改查(IE下)操作实现代码
Jan 30 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
Dec 06 Javascript
将input file的选择的文件清空的两种解决方案
Oct 21 Javascript
jquery form表单序列化为对象的示例代码
Mar 05 Javascript
node.js操作mongodb学习小结
Apr 25 Javascript
javascript自定义右键弹出菜单实现方法
May 25 Javascript
JavaScript多图片上传案例
Sep 28 Javascript
JavaScript事件 "事件对象"的注意要点
Jan 14 Javascript
vue组件如何被其他项目引用
Apr 13 Javascript
JavaScript在控件上添加倒计时功能的实现代码
Jul 04 Javascript
js实现通过开始结束控制的计时器
Feb 25 Javascript
jQuery HTML设置内容和属性操作实例分析
May 20 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
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
php date与gmdate的获取日期的区别
2010/02/08 PHP
php 生成文字png图片的代码
2011/04/17 PHP
php实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
js在IE与firefox的差异集锦
2014/11/11 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
jQuery 3.0中存在问题及解决办法
2016/07/15 Javascript
JS简单测试循环运行时间的方法
2016/09/04 Javascript
详解Javascript中的原型OOP
2016/10/12 Javascript
ES6入门教程之Class和Module详解
2017/05/17 Javascript
浅析Vue自定义组件的v-model
2017/11/26 Javascript
VUE预渲染及遇到的坑
2018/09/03 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
JS实现星星海特效
2019/12/24 Javascript
Django1.7+python 2.78+pycharm配置mysql数据库
2016/10/09 Python
Python模拟脉冲星伪信号频率实例代码
2018/01/03 Python
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
Python判断对象是否为文件对象(file object)的三种方法示例
2019/04/26 Python
Django模型中字段属性choice使用说明
2020/03/30 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
大学生思想汇报范文
2013/12/31 职场文书
实习生评语
2014/04/26 职场文书
关于成绩下滑的自我检讨书
2014/09/20 职场文书
2014群众路线学习笔记
2014/11/06 职场文书
校车安全管理责任书
2015/05/11 职场文书