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 相关文章推荐
一个很酷的拖动层的js类,兼容IE及Firefox
Jun 23 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
Jun 11 Javascript
Jquery中使用setInterval和setTimeout的方法
Apr 08 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
Nov 21 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
Nov 22 Javascript
js正则表达exec与match的区别说明
Jan 29 Javascript
js实现拉幕效果的广告代码
Sep 02 Javascript
Bootstrap3使用typeahead插件实现自动补全功能
Jul 07 Javascript
基于JS实现的随机数字抽签实例
Dec 08 Javascript
JS关于刷新页面的相关总结
May 09 Javascript
浅谈微信小程序列表埋点曝光指南
Oct 15 Javascript
在vue中使用防抖函数组件操作
Jul 26 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
当海贼王变成JOJO风
2020/03/02 日漫
thinkphp 多表 事务详解
2013/06/17 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
php动态添加url查询参数的方法
2015/04/14 PHP
PHP函数引用返回的实例详解
2016/09/11 PHP
Aster vs Newbee BO5 第二场2.19
2021/03/10 DOTA
Script的加载方法小结
2011/01/12 Javascript
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
基于cookie实现zTree树刷新后展开状态不变
2017/02/28 Javascript
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
原生JavaScript实现remove()和recover()功能示例
2018/07/24 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
vue和iview实现Scroll 数据无限滚动功能
2019/10/31 Javascript
判断JavaScript中的两个变量是否相等的操作符
2019/12/21 Javascript
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
Python查询IP地址归属完整代码
2017/06/21 Python
python 读取文本文件的行数据,文件.splitlines()的方法
2018/07/12 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
简单了解python元组tuple相关原理
2019/12/02 Python
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
创业计划书模版
2014/02/05 职场文书
小学生读书感言
2014/02/12 职场文书
设备动力科岗位职责范本
2014/02/23 职场文书
3分钟英语演讲稿
2014/04/29 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
委托公证书样本
2015/01/23 职场文书
入党个人总结范文
2015/03/02 职场文书
高中美术教学反思
2016/02/17 职场文书
应届毕业生的自我评价
2019/06/21 职场文书
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis
利用Apache Common将java对象池化的问题
2022/06/16 Servers