欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-15 15:13:38
定义标准接口 demo ......

定义标准接口

 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>