一、前言
我頁面用的是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的方法及注意事項,希望大家喜歡。