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>
上一篇: mysql数据库limit分页,排序操作
下一篇: golang之defer