我页面用的是EasyUI的弹出窗口里面嵌入一个iframe。
第一:父窗口打开子窗口是一个新增用户信息的iframe子页面,点击保存后,子窗口iframe则去调用父窗口的function closeAddWindow()方法,让父窗口去关闭新增页面;
第二:父窗口打开一个设置用户权限的iframe子窗口,首先打开这个子窗口会全部加载数据库表中所有的存在的权限,然后子窗口需要把加载的权限信息拼接html Append到一个ID为<table></table>上,这里有个问题就是父窗口打开子窗口加载所有权限后根本无法把html 追加到id="tb"的表格上,这个原因很简单,因为父窗口调用子窗口加载所有权限信息的后,没有找到表格元素,因为子页面还没有完全加载完成,这种情况处理在这里也介绍了,给iframe注册一个onload事件,等加载完成后再去调用追加的方法。
好了,简单到这里,让我们瞧瞧更多的事例吧!!~~~~~~(*^__^*) 嘻嘻……
二、iframe子父窗口方法调用
2.1语法使用
1、父窗口嵌入iframe
复制代码 代码如下:
<iframe src="https://www.jb51.net/FChild.html" 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" value="调用子窗口方法" /></div> <br /> <br /> <br /> <iframe src="https://www.jb51.net/FChild.html" 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> 我是子窗体内容</div> <div > <input type="button" 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 title="设置用户角色" closed="true" collapsible="false" minimizable="false" maximizable="false"> </div> <div > <input type="button" 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 src='RoleUsers_Update.aspx?UserID=" + data.UserID + "' 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 src='https://www.jb51.net/RoleUsers_Update.aspx' 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()测试或者浏览器的开发者工具监控