`
cwqcwk1
  • 浏览: 86946 次
文章分类
社区版块
存档分类
最新评论

JavaScript跨域插件 实现双向跨域

 
阅读更多

由于浏览器(同源策略)限制,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://download.csdn.net/detail/cwqcwk1/6675081版本v2

javascript跨域插件jcrossdomain.js

(function (win){
  /** 
   * 没有开花的树 
   * http://blog.csdn.net/mycwq/ 
   * 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跨域,可以在不同域名双向通信,内含demo,支持IE6+、火狐,谷歌等浏览器 配套文章:http://blog.csdn.net/mycwq/article/details/16344171

    javascript插件 解决双向跨域问题

    本文将深入探讨JavaScript插件如何解决双向跨域问题,并通过具体的插件实例——jcrossdomain,来阐述其实现方式。 首先,理解什么是“双向跨域”至关重要。在单向跨域中,通常是一个源请求另一个源的数据,而双向...

    JavaScript实现的双向跨域插件分享

    ### JavaScript实现的双向跨域插件分享知识点 #### 同源策略和跨域问题 在Web开发中,同源策略(Same-origin policy)是一种安全策略,限制了来自不同源的文档或脚本如何交互。同源指的是两个页面拥有相同的协议、...

    js 跨域插件

    实现javascript跨域,可以在不同域名双向通信,内含demo,支持IE6+、火狐,谷歌等浏览器 配套文章:http://blog.csdn.net/mycwq/article/details/16344171

    跨域访问实现

    然而,在实际应用中,比如前后端分离、API接口调用、社交媒体插件等场景,往往需要突破这一限制,这就需要用到跨域访问的技术。 实现跨域访问有多种方法,其中常见的包括: 1. **CORS(Cross-Origin Resource ...

    Openfire strophejs 跨域访问

    它利用了Flash插件可以跨域发送HTTP请求的能力,将原本JavaScript不能跨域的Ajax请求转换为Flash可以执行的跨域请求。Strophe.js的`strophe.flxhr.js`则是Strophe.js的一个扩展,它将Strophe.js的XMLHttpRequest部分...

    ajax跨域解决办法

    3. **IFrame和Window.postMessage**:通过在不同的源之间创建IFrame,利用`window.postMessage`方法可以实现双向通信,从而达到跨域数据交换的目的。这种方法需要双方页面的协调,并且存在一定的兼容性问题。 4. **...

    C#开发IE插件(ActiveX)

    本文将深入探讨如何使用C#开发IE插件,特别是ActiveX控件,并实现与JavaScript的双向交互。ActiveX是Microsoft提出的一种技术,它允许在网页中嵌入各种功能组件,如播放器、Flash等,而C#则提供了强大的面向对象编程...

    跨域jsonp资料包.zip

    JSONP常用于获取API数据、社交媒体插件、广告追踪等需要跨域数据交互的场景。特别是在API接口设计早期,JSONP是解决跨域问题的一个常见选择。 ### JSONP的优缺点 #### 优点 1. **兼容性好**:JSONP适用于所有支持...

    HTML5中使用postMessage实现Ajax跨域请求的方法

    4. Flash:利用Flash插件的跨域特性来实现数据传输。 然而,HTML5为了解决跨域问题,引入了window.postMessage()方法。这个方法提供了一种安全的进行跨源通信的方式,允许Window对象之间使用postMessage方法发送...

    js+socket实现web通讯

    在现代Web开发中,为了实现实时双向通信,JavaScript结合Socket技术(通常指的是WebSocket协议)成为一种常见且强大的解决方案。WebSocket是HTML5引入的一个新特性,允许服务器和浏览器之间建立长时间保持连接的通道...

    FlashXMLHttpRequest

    FlashXMLHttpRequest是一个技术解决方案,主要用于实现JavaScript在浏览器环境中进行跨域异步数据传输。由于浏览器的安全策略限制,JavaScript原生的XMLHttpRequest对象无法直接进行跨域请求,但Flash插件在那时具有...

    vue js 跨域

    Vue.js中可以使用axios或fetch库配合JSONP插件实现。 4. **POSTMessage API**: 当两个页面在不同的源中,可以通过`window.postMessage`方法进行通信。这种方式需要双方窗口都有监听事件和发送消息的代码。 5. **...

    在线聊天js插件

    常见的JavaScript库如Socket.IO和Pusher,可以简化WebSocket的实现,提供更高级的功能,如心跳检测、重连机制和跨域支持。 #### 3.3 前后端通信 前端JS插件负责用户界面交互和WebSocket通信,后端服务器处理消息...

    vue项目结合unity webgl通信(内含untiy+vue代码)

    在本项目中,我们主要探讨的是如何将Vue.js前端框架与Unity WebGL进行集成,实现两者之间的双向通信。Vue.js是一个轻量级、高性能的前端框架,而Unity则是一款强大的3D游戏开发引擎,WebGL是Unity导出为浏览器运行的...

    dwebsocket websocket插件

    WebSocket是一种在客户端...总结来说,`dwebsocket`插件为Django提供了WebSocket支持,使得在Python的Web开发环境中实现双向实时通信变得更加简单。通过它,开发者可以构建出高性能、低延迟的实时应用,提高用户体验。

    jsjava2.0bin资源包

    6. **JSONP(JSON with Padding)** 和 **CORS(Cross-Origin Resource Sharing)**:这两个机制允许JavaScript跨域访问Java服务,是前后端数据交换的常见手段。 7. **Web Services**:包括RESTful API和SOAP等,...

    Silverlight如何与JS相互调用

    Silverlight是由微软开发的一种插件技术,用于在浏览器中创建丰富的媒体和交互式用户体验,而JavaScript则是Web前端的主要脚本语言,负责处理用户交互、动态内容更新等任务。当这两种技术结合时,能够实现更复杂的...

Global site tag (gtag.js) - Google Analytics