本文给大家介绍 iframe 中子父类窗口调用 JS 的方法及注意事项,介绍的超详细,需要的朋友快来学习下
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
一、前言
我页面用的是 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 的方法及注意事项,希望大家喜欢。
来源: