您的位置:首页 > Web前端 > JavaScript

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

2017-03-31 14:04 627 查看
本文转自打开

一、前言

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

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

第二:父窗口打开一个设置用户权限的iframe子窗口,首先打开这个子窗口会全部加载数据库表中所有的存在的权限,然后子窗口需要把加载的权限信息拼接html Append到一个ID为
上,这里有个问题就是父窗口打开子窗口加载所有权限后根本无法把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的方法及注意事项,希望大家喜欢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  html js iframe