当前位置: 移动技术网 > IT编程>开发语言>JavaScript > js 封装父页面子页面交互接口

js 封装父页面子页面交互接口

2019年06月25日  | 移动技术网IT编程  | 我要评论

定义标准接口

 interface= {};
 interface.parentwin = {};
 interface.childwin = {};


 /**
  * 父页面提供的标准接口函数名称
  */
 interface.parentwin.funname = {
     getdatafun: "getdatafun", //子页面调用,提供给子页面的数据接口
     updatedatafun: "updatedatafun", //子页面调用,向父页面提交数据接口
     closefun: "closefun" //子页面需要关闭时,调用父页面的关闭窗口接口
 }


 /**
  * 父页面设置需要提供给子页面的接口函数
  * @param childwinid :要使用的子页面对应接口的id,该id需要与子页面中定义的id一致
  * @param functionname  : 需要注册的回调函数名称,接口名称只能是interface.parentwin.funname中定义的名称
  * @param callbackfun :子页面数据向父页面更新数据时的回调函数,接口入参为js对象
  */
 interface.parentwin.setfunforchild = function(childwinid, functionname, callbackfun) {
     if (comm.isempty(childwinid)) {
         alert("没有为子页面调用接口定义对象id");
         return;
     }
     //保存父页面提供给子页面调用的接口总对象
     if (comm.isempty(window.childcallbackobj)) {
         window.childcallbackobj = {};
     }
     //与指定子页面对应的回调接口对象
     var childcallbackobj = window.childcallbackobj;
     if (comm.isempty(childcallbackobj[childwinid])) {
         childcallbackobj[childwinid] = {};
     }

     var childobj = childcallbackobj[childwinid];
     if (!comm.isempty(childobj[functionname])) {
         alert("子页面" + childwinid + " 所需调用接口已存在" + functionname);
         return;
     }
     //检查接口是否为注册的接口
     for (var pro in interface.parentwin.funname) {
         if (interface.parentwin.funname[pro] == functionname) {
             childobj[functionname] = callbackfun;
             return;
         }
     }
     alert("子页面 " + childwinid + " 所需调用接口未注册:" + functionname + "。请检查接口定义声明对象。");
 }


 /**
  * 检查指定的子页面调用接口是否存在
  */
 interface.childwin.checkvalid = function(childwinid, funname) {
     var parentwin = window.parent;
     var childcallbackobj = parentwin.childcallbackobj;
     if (comm.isempty(childwinid)) {
         alert("子页面调用接口定义对象id不能为空!");
         return false;
     }
     if (comm.isempty(childcallbackobj)) {
         alert("父页面调用接口定义的对象不存在");
         return false;
     }
     var childobj = childcallbackobj[childwinid];
     if (comm.isempty(childobj)) {
         alert("子页面调用接口定义的对象不存在");
         return false;
     }
     if (comm.isempty(childobj[funname])) {
         alert("父页面调用接口定义不存在:" + funname);
         return false;
     }
     return true;
 }


 /**
  * 子页面调用父页面的接口函数
  * @childwinid :子页面定义的自身页面id
  * @funcname : 需要调用的回调函数名称
  * @params :  需要传递的参数
  * @return :如果函数有返回值则通过其进行返回
  */
 interface.childwin.callback = function(childwinid, funcname, params) {
     if (!interface.childwin.checkvalid(childwinid, funcname)) {
         return;
     }

     var parentwin = window.parent;
     var childobj = parentwin.childcallbackobj[childwinid];
     return childobj[funcname].call(parentwin, params);
 }

demo

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>父页面</title>
    </head>
    <body>
        
        <script src="js/common.js"></script>
        <script>
            //传给子页面的值
            interface.parentwin.setfunforchild("data", interface.parentwin.funname.getdatafun, function() {
                return value;
            });
            
            //获取子页面函数并调用
            window.fun;
            interface.parentwin.setfunforchild("test",interface.parentwin.funname.updatedatafun,function(param){
                fun = param;
            });
            
            //调用
            var val = fun("1111");
            console.log(val);
        </script>
    </body>
</html>
<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>子页面</title>
    </head>
    <body>
        <script src="js/common.js"></script>
        <script>
            
            //父页面传入数据
            var data = interface.childwin.callback("data", interface.parentwin.funname.getdatafun);  
            console.log(data);
            
            //提供给父页面调用的函数
            interface.childwin.callback("test",interface.parentwin.funname.updatedatafun,function(data){
                alert(data);
                var str = "xxx";
                return str;
            });
            
        </script>
    </body>
</html>

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网