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


Posted in Javascript onJune 25, 2019

定义标准接口

 

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>

总结

以上所述是小编给大家介绍的JS 封装父页面子页面交互接口的实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
学习ExtJS(一) 之基础前提
Oct 07 Javascript
获取网站跟路径的javascript代码(站点及虚拟目录)
Oct 20 Javascript
jQuery制作仿腾讯web qq用户体验桌面
Aug 20 Javascript
jQuery打印指定区域Html页面并自动分页
Jul 04 Javascript
jquery.ajax之beforeSend方法使用介绍
Dec 08 Javascript
js实现按钮颜色渐变动画效果
Aug 20 Javascript
jQuery获取与设置iframe高度的方法
Aug 01 Javascript
Vue.js -- 过滤器使用总结
Feb 18 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
Oct 27 Javascript
浅谈使用React.setState需要注意的三点
Dec 18 Javascript
学习JS中的DOM节点以及操作
Apr 30 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
微信小程序Echarts图表组件使用方法详解
Jun 25 #Javascript
ES6 Object方法扩展的应用实例分析
Jun 25 #Javascript
ES6 Object属性新的写法实例小结
Jun 25 #Javascript
ES6模板字符串和标签模板的应用实例分析
Jun 25 #Javascript
基于Node.js搭建hexo博客过程详解
Jun 25 #Javascript
Node.js实现简单的爬取的示例代码
Jun 25 #Javascript
浅谈目前可以使用ES10的5个新特性
Jun 25 #Javascript
You might like
DOMXML函数笔记
2006/10/09 PHP
比较好用的PHP防注入漏洞过滤函数代码
2012/04/11 PHP
php分页示例分享
2014/04/30 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
php中请求url的五种方法总结
2017/07/13 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
Javascript创建自定义对象 创建Object实例添加属性和方法
2012/06/04 Javascript
解析jquery获取父窗口的元素
2013/06/26 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
AngularJS基础 ng-csp 指令详解
2016/08/01 Javascript
原生js的RSA和AES加密解密算法
2016/10/08 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
微信小程序实现点击图片放大预览
2019/10/21 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
python利用正则表达式排除集合中字符的功能示例
2017/10/10 Python
PyCharm的设置方法和第一个Python程序的建立
2019/01/16 Python
python3.7 sys模块的具体使用
2019/07/22 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
CSS3网格的三个新特性详解
2014/04/04 HTML / CSS
英国豪华装饰照明品牌的在线零售商:Inspyer Lighting
2019/12/10 全球购物
兰蔻法国官方网站:Lancôme法国
2020/02/22 全球购物
学习自我鉴定
2014/02/01 职场文书
《纸船和风筝》教学反思
2014/02/15 职场文书
《乌塔》教学反思
2014/02/17 职场文书
职业生涯规划书结束语
2014/04/15 职场文书
《唯一的听众》教学反思
2016/02/18 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
MySQL数据库事务的四大特性
2022/04/20 MySQL