(js 父子页面数据的交互以及父子页面的侦听)(客户端通用消息门户框架)

今天记录一下做项目时框架组封装的一个非常强大的客户端通用消息门户框架。此框架可以实现父子页面之间的交互与数据传递。

最常见的有这几种情况:

1:父页面的改变需要传递数据给子页面来改变子页面的内容。

2:子页面完成一些事情通知父页面来做一些改变。


下边先贴出封装的js代码:

/**
 * 客户端通用消息门户框架
 */
(function($) {
    "use strict";
    var MPBUS = {
        /**
         * 路由总线
         */
        routerBus: {},
        /**
         * 消息管理的窗口列表
         */
        windows: [],
        /**
         *  消息总线的触发器
         * @param {type} event 事件类型
         * @param {type} data 事件数据
         * @param {type} type 数据类型
         * @returns {unresolved}
         */
        _fire: function(event, data, type) {
            var me = this;
            jQuery.each(this.windows, function(i, v) {
                if (Object.prototype.hasOwnProperty.call(v, 'RFMP') /*v.hasOwnProperty('RFMP')*/ && v.RFMP !== null && v.RFMP !== undefined) {
                    v.RFMP._fire(event, data, type);
                }
            });
            //处理路由
            jQuery.each(this.routerBus, function(k, v) {
                if (k === event) {
                    var target = v.target;
                    var func = v.func;
                    var newData = func.call(this, data, type);
                    if (newData != undefined && newData != null) {
                        var targetType;
                        var targetData;
                        if (Object.prototype.hasOwnProperty.call(newData, 'type') /*newData.hasOwnProperty('type')*/ && newData.type != undefined) {
                            targetType = newData.type;
                        } else {
                            targetType = type;
                        }
                        if (Object.prototype.hasOwnProperty.call(newData, 'data')/*newData.hasOwnProperty('data')*/ && newData.data != undefined)
                        {
                            targetData = newData.data;
                        } else {
                            targetData = newData;
                        }
                        me._fire(target, targetData, targetType);
                    }
                }
            });
        }
    };
    var RFMP = {
        /**
         * 消息总线所在窗口
         */
        BUSWINDOW: undefined,
        /**
         * 本窗口消息总线
         */
        eventBus: {},
        /**
         * 获得窗口的父窗口
         * @param {type} win
         * @returns {unresolved}
         */
        parentWindow: function(win) {
            if (win === undefined || win === null)
                return null;
            var parent = win.opener;
            if (parent && parent !== win)
                return parent;
            parent = win.parent;
            return parent !== win ? parent : null;
        },
        /**
         *  获得消息总线窗口
         * @param {type} win
         * @returns {@exp;win@pro;RFMP_Windows}
         */
        _getBusWindow: function(win) {
            if (win === undefined || win === null)
                return null;
            if (jQuery.isPlainObject(win.MPBUS)) {
                return win;
            } else {
                var pwin = this.parentWindow(win);
                return this._getBusWindow(pwin);
            }
        },
        /**
         * 将自身窗口注册到消息总线中
         * @param {type} win
         * @returns {undefined}
         */
        register: function(win) {
            var busWindow = this._getBusWindow(win);
            if (busWindow === undefined || busWindow === null) {
                window.MPBUS = MPBUS;
                busWindow = window;
            }
            var haswindow = false;
            jQuery.each(busWindow.MPBUS.windows, function(i, v) {
                if (v === win)
                    haswindow = true;
            });
            if (!haswindow)
                busWindow.MPBUS.windows.push(window);
            this.BUSWINDOW = busWindow;
        },
        /**
         *  向消息门户发送事件
         * @param {type} event 事件类型
         * @param {type} data 事件数据
         * @param {type} type 数据类型
         * @returns {unresolved}
         */
        send: function(event, data, type) {
            if (jQuery.isWindow(this.BUSWINDOW)) {
                this.BUSWINDOW.MPBUS._fire(event, data, type);
            }
        },
        /**
         * 消息注册方法
         * @param {type} event
         * @param {type} func
         * @returns {undefined}
         */
        on: function(event, func) {
            this.eventBus[event] = func;
        },
        /**
         * 消息路由方法
         *
         * @param {type} event 源消息名称
         * @param {type} target 目标消息名称
         * @param {type} func 数据转换方法,返回的数据使用 {data:newData,type:newType }形封装
         * @returns {undefined}
         */
        route: function(event, target, func) {
            if (jQuery.isWindow(this.BUSWINDOW)) {
                this.BUSWINDOW.MPBUS.routerBus[event] = {target: target, func: func};
            }
        },
        /**
         * 本窗口事件触发器
         * @param {type} event
         * @param {type} data
         * @param {type} type
         */
        _fire: function(event, data, type) {
            var me = this;
            jQuery.each(this.eventBus, function(k, v) {
                if (k === event) {
                    v.call(me, data, type);
                }
            });
        },
        /**
         * 反注册窗口
         * @param {type} win
         */
        unregister: function(win) {
            var busWindow = this.BUSWINDOW;
            if (jQuery.isWindow(busWindow)) {
                var deleteIndex = -1;
                for (var i = 0; i < busWindow.MPBUS.windows.length; i++) {
                    if (busWindow.MPBUS.windows[i] === win) {
                        deleteIndex = i;
                        break;
                    }
                }
            }
            if (deleteIndex >= 0) {
                busWindow.MPBUS.windows.splice(deleteIndex, 1);
            }
        }
    };
    RFMP.register(window);
    window.RFMP = RFMP;
    //window.onunload = RFMP.unregister(window);
})(jQuery);

 以上就是所有的js代码。下边介绍一下此功能的用法:

 1:父页面传递数据给子页面:

 

父页面test.jsp:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>学生管理</title>
        <script type="text/javascript"  src="rflib.js"></script>
        <script language="javascript">
               //注册任意事件
               RFMP.on("overClick",callClick);
                
                //回调函数
                function callClick(data){
                   alert("事件监听到了"+data.name);
               }
 
                function rt(){
                    //触发事件
                   RFMP.send("treeInfo",{name:"lych"});
                }
        </script>
    </head>
    <body>
        测试页面<button οnclick="rt()">测试</button>
        <iframe  width=100% height=100%  src="test_1.jsp" frameborder="0"  ></iframe>
    </body>
</html>



子页面test_1.jsp:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>学生管理</title>
        <script type="text/javascript"  src="rflib.js"></script>
        <script language="javascript">
               function ck(){
                   RFMP.send("overClick",{name:"lych"});
                   
                //注册任意事件
                RFMP.on("treeInfo",function(data, treeType) {
                    alert("route"+data.name);
                })
               }
        </script>
    </head>
    <body>
        iframe测试页面
        <button οnclick="ck()">点击</button>
    </body>
</html>


上边页面父页面test.jsp里边有个子页面,当点击测试按钮后就会执行ck()方法,然后出发事件,后边{}是出发事件需要携带的数据。而在子页面里边注册了一个treeInfo事件。侦听事件的触发。当事件触发之后子页面就会收到父页面传递的数据。

同理在子页面里边触发事件,在父页面里边添加侦听也可以获取到子页面传递给父页面的数据。


呵呵,其实此框架的封装还有一些其他额外功能,暂时就不再次做说明了。在项目中运用最多的就是这一功能。后续用到其他功能还会再做完善,此文章仅仅用来记录以便日后代码的重用。




    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值