iframe中子父类窗口调用JS的方法及注意事项


Posted in Javascript onAugust 25, 2015

一、前言

我页面用的是EasyUI的弹出窗口里面嵌入一个iframe。

第一:父窗口打开子窗口是一个新增用户信息的iframe子页面,点击保存后,子窗口iframe则去调用父窗口的function closeAddWindow()方法,让父窗口去关闭新增页面;

第二:父窗口打开一个设置用户权限的iframe子窗口,首先打开这个子窗口会全部加载数据库表中所有的存在的权限,然后子窗口需要把加载的权限信息拼接html  Append到一个ID为<table id="tb"></table>上,这里有个问题就是父窗口打开子窗口加载所有权限后根本无法把html 追加到id="tb"的表格上,这个原因很简单,因为父窗口调用子窗口加载所有权限信息的后,没有找到表格元素,因为子页面还没有完全加载完成,这种情况处理在这里也介绍了,给iframe注册一个onload事件,等加载完成后再去调用追加的方法。

好了,简单到这里,让我们瞧瞧更多的事例吧!!~~~~~~(*^__^*) 嘻嘻……

二、iframe子父窗口方法调用

2.1语法使用

1、父窗口嵌入iframe  

<iframe id='myFrame' name="myFrame" src="FChild.html" width='100%' height='100%' frameborder='0'></iframe>

2、父窗口调用子窗口方法  

myFrame.window.sonMethod();

3、子窗口调用父窗口方法   

 parent.fatherMethod();

4、兼容浏览器的iframe 加载完成方法

if (myFrame.attachEvent) {
      myFrame.attachEvent("onload", function () {
        alert("兼容IE加载的加载方法");
      });
    } else {
      myFrame.onload = function () {
        alert("兼容其他浏览器加载方法");
      };
    }

2.2语法代码

Father.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title></title>
</head>
<body>
  <div>我是父窗口内容</div>
  <div><input type="button" id="btnFather" value="调用子窗口方法" /></div>
  <br />
  <br />
  <br />
  <iframe id='myFrame' name="myFrame" src="FChild.html" width='100%' height='100%' frameborder='0'></iframe>
  <script type="text/javascript">
    document.getElementById("btnFather").onclick=function () {
      myFrame.window.sonMethod();
    }
    function fatherMethod() {
      alert("父窗口方法!");
    }
    if (myFrame.attachEvent) {
      myFrame.attachEvent("onload", function () {
        alert("兼容IE加载的加载方法");
      });
    } else {
      myFrame.onload = function () {
        alert("兼容其他浏览器加载方法");
      };
    }
  </script>
</body>
</html>

FChild.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title></title>
</head>
<body>
  <div style="border:1px solid red;"> 我是子窗体内容</div> 
   <div > <input type="button" id="btnSon" value="调用父窗口方法" /></div> 
   <script type="text/javascript">
     document.getElementById("btnSon").onclick = function () {
       parent.fatherMethod();
     }
     function sonMethod() {
       alert("子窗口方法!");
     }
  </script>
</body>
</html>

三、什么情况下使用到 myFrame.onload 或者 myFrame.attachEvent

这里使用的是easyui框架前端框架 

<div id="divRoleUsers" title="设置用户角色" class="easyui-window" closed="true" collapsible="false" minimizable="false" maximizable="false" style="width: 140px; height: 250px; padding: 5px;">
   </div>
 <div > <input type="button" id="btn" value="设置用户角色" /></div> 
 <script type="text/javascript">
 $("#btn").click(function () {
showSetUserRoleWindow();
});
    //设置用户角色
    function showSetUserRoleWindow() {
      var getSelections = $("#tt").datagrid("getSelections");
      if (getSelections.length > 1 || getSelections.length == 0) {
        $.messager.alert("错误提示", "请选中一行数据!", "error");
        return false;
      }
      var data = getSelections[0]; //获取选中的一行所有json的数据
      //if ($("#divRoleUsers #iframe").length != 0) {
      //  $("#divRoleUsers #iframe").remove();
      //}
      //  $('#divRoleUsers').append("<iframe id='iframe' name='iframe' src='RoleUsers_Update.aspx?UserID=" + data.UserID + "' width='100%' height='100%' frameborder='0'></iframe>");
      //错误做法!:上面src='RoleUsers_Update.aspx?UserID=" + data.UserID + "'   这里通过拼接参数iframe的src,
      //然后通过子窗口 parent.document.getElementById("iframe").getAttribute("src");//获取父窗体iframe的src 发现根据获取不到UserID的值,为null,也是因为加载顺序先后的问题,导致我要用给iframe注册onload事件后才能获取到我需要的结果
      //if (myframe.attachEvent) {
      //  myframe.attachEvent("onload", function () {
      //    alert("Local iframe is now loaded.");
      //    myframe.window.loadAllRole();
      //  });
      //} else {
      //  myframe.onload = function () {
      //    alert("Local iframe is now loaded.");
      //    myframe.window.loadAllRole();
      //  };
      //}
      if ($("#divRoleUsers #myframe").length != 0) {   //这一步是必须的!!!,因为不加这一句下面onload绑定事件只执行一次,我需要每次加载完iframe都调用一次子窗口的方法!
        $("#divRoleUsers #myframe").remove();
      }
      $('#divRoleUsers').append("<iframe id='myframe' name='myframe' src='RoleUsers_Update.aspx' width='100%' height='100%' frameborder='0'></iframe>");
      if (myframe.attachEvent) {
        myframe.attachEvent("onload", function () {
          myframe.window.loadAllRole(); 
          myframe.window.loadUserRole(data.UserID);
        });
      } else {
        myframe.onload = function () {
          myframe.window.loadAllRole();     //调用子窗口iframe里面的方法加载所有的角色checkbox
          myframe.window.loadUserRole(data.UserID);   //接着传递用户ID过去给子窗口的方法,给用户拥有的角色设置checkbox选中
        };
      }
      $('#divRoleUsers').window('open');
    }
  </script>

 四、总结几个关键点吧

父子窗口方法的调用,注意加载的先后顺序才能获取到想要的结果,遇到问题常用alter()测试或者浏览器的开发者工具监控

以上内容就是本文中介绍iframe中子父类窗口调用JS的方法及注意事项,希望大家喜欢。

Javascript 相关文章推荐
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
Sep 22 Javascript
让Firefox支持event对象实现代码
Nov 07 Javascript
FireFox下XML对象转化成字符串的解决方法
Dec 09 Javascript
Javascript算符的优先级介绍
Mar 20 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
Dec 17 Javascript
Jquery中扩展方法extend使用技巧
Aug 24 Javascript
jQuery实现页面顶部显示的进度条效果完整实例
Dec 09 Javascript
JS中innerHTML和pasteHTML的区别实例分析
Jun 22 Javascript
基于JavaScript实现轮播图代码
Jul 14 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
Feb 01 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
Apr 15 Javascript
详解基于Wepy开发小程序插件(推荐)
Aug 01 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
Aug 25 #Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
Aug 25 #Javascript
jquery实现向下滑出的二级导航下滑菜单效果
Aug 25 #Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
Aug 25 #Javascript
js文本框走动跑马灯效果代码分享
Aug 25 #Javascript
jQuery实现图片左右滚动特效
Apr 20 #Javascript
JS+CSS实现滑动切换tab菜单效果
Aug 25 #Javascript
You might like
php采用ajax数据提交post与post常见方法总结
2014/11/10 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
PHP写API输出的时用echo的原因详解
2019/04/28 PHP
js异或加解密效果代码
2008/06/25 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
2017/06/25 Javascript
Nodejs调用WebService的示例代码
2017/09/29 NodeJs
javascript按钮禁用和启用的效果实例代码
2017/10/29 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
使用vue-cli编写vue插件的方法
2018/02/26 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
2018/04/12 jQuery
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
vue过滤器用法实例分析
2019/03/15 Javascript
javascript绘制简单钟表效果
2020/04/07 Javascript
JS遍历树层级关系实现原理解析
2020/08/31 Javascript
spyder常用快捷键(分享)
2017/07/19 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
Python编写一个优美的下载器
2018/04/15 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
2018/12/10 Python
pycharm重命名文件的方法步骤
2019/07/29 Python
Python列表的切片实例讲解
2019/08/20 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
2020/06/28 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
Python 日期与时间转换的方法
2020/08/01 Python
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
秋季运动会稿件
2014/01/30 职场文书
六一儿童节园长致辞
2015/07/31 职场文书
导游词之日月潭
2019/11/05 职场文书
如何解决php-fpm启动不了问题
2021/11/17 PHP
ant design vue的form表单取值方法
2022/06/01 Vue.js