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 相关文章推荐
JavaScript实现页面实时显示当前时间的简单实例
Jul 20 Javascript
JS加jquery简单实现标签元素的显示或隐藏
Sep 23 Javascript
javascript获取web应用根目录的方法
Feb 12 Javascript
JavaScript拆分字符串时产生空字符的解决方案
Sep 26 Javascript
jQuery中delegate()方法用法实例
Jan 19 Javascript
jQuery返回定位插件详解
May 15 jQuery
Cpage.js给组件绑定事件的实现代码
Aug 31 Javascript
angular4 共享服务在多个组件中数据通信的示例
Mar 30 Javascript
微信小程序的tab选项卡的实现效果
May 15 Javascript
Vue为什么要谨慎使用$attrs与$listeners
Aug 27 Javascript
jquery简易手风琴插件的封装
Oct 13 jQuery
vue+vant实现购物车全选和反选功能
Nov 17 Vue.js
微信小程序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
PHP使用phpunit进行单元测试示例
2019/09/23 PHP
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
Highcharts使用简例及异步动态读取数据
2015/12/30 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
微信扫码支付零云插件版实例详解
2017/04/26 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
微信小程序实现打卡签到页面
2020/09/21 Javascript
微信小程序开发数据缓存基础知识辨析及运用实例详解
2020/11/06 Javascript
Python中字典和集合学习小结
2017/07/07 Python
python使用scrapy发送post请求的坑
2018/09/04 Python
Django实现单用户登录的方法示例
2019/03/28 Python
scikit-learn线性回归,多元回归,多项式回归的实现
2019/08/29 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
2020/02/27 Python
Python 从attribute到property详解
2020/03/05 Python
python 成功引入包但无法正常调用的解决
2020/03/09 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
2020/06/28 Python
介绍一下Linux中的链接
2016/06/05 面试题
市场营销专科应届生求职信
2013/11/24 职场文书
英语专业学生个人求职信范文
2014/01/06 职场文书
单位作风建设自查报告
2014/10/23 职场文书
公司辞职信模板
2015/05/13 职场文书
物业保洁员管理制度
2015/08/05 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
小学四年级作文之写景
2019/08/23 职场文书
扩展多台相同的Web服务器
2021/04/01 Servers
Redis RDB技术底层原理详解
2021/09/04 Redis