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 动态添加表格行
Jun 22 Javascript
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
Apr 27 Javascript
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
Jun 28 Javascript
javascript:history.go()和History.back()的区别及应用
Nov 25 Javascript
使用Math.floor与Math.random取随机整数的方法详解
May 07 Javascript
jQuery遍历对象、数组、集合实例
Nov 08 Javascript
jquery验证邮箱格式并显示提交按钮
Nov 07 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
Dec 10 Javascript
谈一谈javascript中继承的多种方式
Feb 19 Javascript
Vue原理剖析 实现双向绑定MVVM
May 03 Javascript
vue params、query传参使用详解
Sep 12 Javascript
在Layui中实现开关按钮的效果实例
Sep 29 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
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
PHP 检查扩展库或函数是否可用的代码
2010/04/06 PHP
php基础教程 php内置函数实例教程
2012/08/21 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
PHP封装的非对称加密RSA算法示例
2018/05/28 PHP
jquery入门—访问DOM对象方法
2013/01/07 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
2015/08/21 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
js正则表达式replace替换变量方法
2016/05/21 Javascript
使用jQuery给input标签设置默认值
2016/06/20 Javascript
完美实现八种js焦点轮播图(上篇)
2016/07/18 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
2020/07/07 Javascript
[33:23]VG vs Pain 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python socket网络编程步骤详解(socket套接字使用)
2013/12/06 Python
Python中分数的相关使用教程
2015/03/30 Python
Python多进程分块读取超大文件的方法
2016/04/13 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
Python的matplotlib绘图如何修改背景颜色的实现
2019/07/16 Python
python系列 文件操作的代码
2019/10/06 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
python3 re返回形式总结
2020/11/20 Python
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
德国奢侈品网上商城:Mytheresa
2016/08/24 全球购物
如何在存储过程中使用Loop
2016/01/05 面试题
信息总监管理职责范本
2014/03/08 职场文书
垃圾分类的活动方案
2014/08/15 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python
MySQL导致索引失效的几种情况
2022/06/25 MySQL