JS 封装父页面子页面交互接口的实例代码

定义标准接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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>

猜你喜欢

转载自www.cnblogs.com/orzhangz/p/11088092.html