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 相关文章推荐
Jquery在IE7下无法使用 $.ajax解决方法
Nov 11 Javascript
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
Sep 20 Javascript
js动态创建表格,删除行列的小例子
Jul 20 Javascript
js借助ActiveXObject实现创建文件
Sep 29 Javascript
jquery ajax分页插件的简单实现
Jan 27 Javascript
深入理解Javascript箭头函数中的this
Feb 13 Javascript
vue2 中如何实现动态表单增删改查实例
Jun 09 Javascript
react路由配置方式详解
Aug 07 Javascript
node实现定时发送邮件的示例代码
Aug 26 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
Jan 08 Javascript
Vue实现简易计算器
Feb 25 Javascript
ant design pro中可控的筛选和排序实例
Nov 17 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
PHP的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
简单的php文件上传(实例)
2013/10/27 PHP
php数组使用规则分析
2015/02/27 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
php实现多站点共用session实现单点登录的方法详解
2019/09/18 PHP
prototype Element学习笔记(篇一)
2008/10/26 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
2015/08/13 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
2015/09/14 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
2016/09/17 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
vue 动态创建组件的两种方法
2020/12/31 Vue.js
Python字符串逐字符或逐词反转方法
2015/05/21 Python
Python 异常处理的实例详解
2017/09/11 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
Python入门学习指南分享
2018/04/11 Python
django表单的Widgets使用详解
2019/07/22 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
python使用pip安装SciPy、SymPy、matplotlib教程
2019/11/20 Python
Python爬虫HTPP请求方法有哪些
2020/06/03 Python
线程的基本概念、线程的基本状态以及状态之间的关系
2012/10/26 面试题
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
社区助残日活动总结
2014/08/29 职场文书
金融专业银行实习证明模板
2014/11/28 职场文书
房产公证书
2015/01/23 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
教你使用Python pypinyin库实现汉字转拼音
2021/05/27 Python
Java SSH 秘钥连接mysql数据库的方法
2021/06/28 Java/Android
Go语言安装并操作redis的go-redis库
2022/04/14 Golang