zoukankan      html  css  js  c++  java
  • ifame 与父页面进行数据交互(跨域)

    解决的方法主要是 通过使用 “Web API  window.postMessage()” 方法

    1、postMessage 方法的详细介绍这里就不赘述了。

    请参考比较权威的讲解 传送门

    2、postMessage 的使用案例

    // 官方的例子,这里就不再展示了,写一写自己使用的方法
    
    // 一个消息管理的构造函数
    function MessageManager() {
            var event;
            var that = this;
            // 处理消息    
            this.processMessage = function (ev) {};
            /**
            * 用于发送消息
            * @param string  msg  要发送的消息内容
            * @param obj otherWindow 接受消息的窗口(页面)的引用, 
            * 如果是window.open()打开的窗口,那么 otherWindow=window.open(), 
            * 如果是iframe, 那么 otherWindow=iframe.contentWindow
            * 如果不传此参数,那么会以上次接收到的消息的发送者作为引用
            * @param string target (可选) 接收消息窗口的 url,不写默认为 *
            */
            this.sendMessage = function (msg, otherWindow, target) {
                var w = otherWindow || event.source;
                var t = event ? event.origin : (target || '*');
                w.postMessage(msg, t);
            };
    
            // 在实例化当前构造函数的时候,顺便添加一个监听消息事件
            // 这个事件监听,主要用于接管 通过postMessage方法发送过来的消息
            window.addEventListener("message", function(ev) {
                // 保存本次接收到的事件对象
                event = ev;
                // 处理本次的事件
                that.processMessage(ev);
            }, false);
    }
    
    
    // ====== 父页面的用法,start ======
    
    // 实例化一个消息管理的对象
    var msgMng = new MessageManager();
    // 接管处理消息方法, 用于接管iframe子页面发送来的消息
    msgMng.processMessage = function (ev) {
        // ev.data 在消息事件中,data属性就是 发送的数据(对应message),可以根据这个来做一系列判断和相应的操作
        console.log(ev, ev.data);
    }
    
    window.onload = function () {
        // 当父页面加载完成后,给每一个iframe子页面先通知一次
        var iframes = document.querySelectorAll('iframe');
        for (var i = 0; i < iframes.length; i++) {
            msgMng.sendMessage('notice', iframes[i].contentWindow);
        }
    }
    
    // 后序如果需要与iframe子页面进行交互,可以根据业务逻辑来调用  msgMng.sendMessage 方法
    msgMng.sendMessage('hello', iframes[n]); // iframes[n]是代表 iframe 集合里其中一个
    
    // ====== 父页面的用法,end ======
    
    
    
    // ====== iframe子页面的用法,start ======
    
    // 实例化一个消息管理的对象
    var msgMng = new MessageManager();
    // 接管处理消息方法, 用于接管父页面发送来的消息
    msgMng.processMessage = function (ev) {
        // ev.data 在消息事件中,data属性就是 发送的数据(对应message),可以根据这个来做一系列判断和相应的操作
        console.log(ev, ev.data);
    }
    
    // 如果需要父页面进行交互,可以根据业务逻辑来调用  msgMng.sendMessage 方法 
    // 这里不传第二个参数,默认会以父页面做为窗口引用,是因为在父页面在加载完成后,就给每一个iframe子页面做了一次消息通知,当iframe子页面接收到消息后,会将消息事件保存. 
    msgMng.sendMessage('hello');
    
    // ====== iframe子页面的用法,end ======
    Talk is cheap, show me the code.
  • 相关阅读:
    条件类的设计
    条件对象的设计
    又是一个星期天,明天又要开始一周的工作了,想想上周的工作情况,不怎么理想。
    自动设置的类,版本2,在设计上比前一个版本有进步。
    最近写了一个自动保存设置的类。
    关于异常信息"未找到成员"
    表达式类的设计
    IExtenderProvider 接口的应用.实现自定义组件LilyValidateProvider
    IIS404的问题
    程序开发[对象的旅行]
  • 原文地址:https://www.cnblogs.com/cidgur/p/12887716.html
Copyright © 2011-2022 走看看