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 中关于CSS操作部分使用说明
Jun 10 Javascript
JavaScript设置FieldSet展开与收缩
May 15 Javascript
js写一个弹出层并锁屏效果实现代码
Dec 07 Javascript
Jquery动态改变图片IMG的src地址示例
Jun 25 Javascript
js格式化时间和js格式化时间戳示例
Feb 10 Javascript
js实现文字闪烁特效的方法
Dec 17 Javascript
JS实现的添加弹出层并完成锁屏操作示例
Apr 07 Javascript
微信小程序实现打开内置地图功能【附源码下载】
Dec 07 Javascript
vue学习教程之带你一步步详细解析vue-cli
Dec 26 Javascript
layer弹出层自定义提交取消按钮的例子
Sep 10 Javascript
Vue实现计算器计算效果
Aug 17 Javascript
vue 中的动态传参和query传参操作
Nov 09 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伪静态写法附代码
2008/06/20 PHP
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
2011/05/10 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
JS在IE下缺少标识符的错误
2014/07/23 Javascript
jquery中$(#form :input)与$(#form input)的区别
2014/08/18 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
纯javascript实现四方向文本无缝滚动效果
2015/06/16 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
微信小程序 开发工具快捷键整理
2016/10/31 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
javascript实现移动端红包雨页面
2020/06/23 Javascript
python获取文件后缀名及批量更新目录下文件后缀名的方法
2014/11/11 Python
Python标准库os.path包、glob包使用实例
2014/11/25 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
python 寻找list中最大元素对应的索引方法
2018/06/28 Python
django认证系统实现自定义权限管理的方法
2018/07/16 Python
详解pandas安装若干异常及解决方案总结
2019/01/10 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
女性时尚在线:IVRose
2019/02/23 全球购物
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
最新教师自我评价分享
2013/11/12 职场文书
开学随笔
2015/08/15 职场文书
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js