ホームページ >ウェブフロントエンド >jsチュートリアル >iframe_javascriptスキルで子親クラスウィンドウでJSを呼び出す方法と注意点
1. はじめに
私のページは、iframe が埋め込まれた EasyUI のポップアップ ウィンドウを使用しています。
最初: 親ウィンドウが子ウィンドウを開くと、ユーザー情報を追加する iframe サブページが表示されます。[保存] をクリックすると、子ウィンドウ iframe は親ウィンドウの関数 closeAddWindow() メソッドを呼び出し、親ウィンドウを閉じることができます。新しく追加されたページ
2 番目: 親ウィンドウは、ユーザー権限を設定するための iframe サブウィンドウを開きます。まず、このサブウィンドウを開くと、データベース テーブル内の既存の権限がすべて読み込まれます。次に、サブウィンドウは、読み込まれた権限情報を結合する必要があります。 html ID への追加 481b26505f1e161e4c14f72858b14c10f16b1740fad44fb09bfe928bcc527e08 の場合、親ウィンドウが子ウィンドウを開いてすべての権限をロードした後、テーブルに html を追加できないという問題があります。この理由は非常に単純で、親ウィンドウが子ウィンドウを呼び出してすべての権限情報をロードした後、子ページが完全にロードされていないためにテーブル要素が見つからないためです。ここでも紹介されています。iframe の onload イベントを登録し、読み込みが完了するまで待ちます。その後、append メソッドを呼び出します。
はい、以上です。もっと例を見てみましょう! ! ~~~~~~(*^__^*) ふふふ…
2. iframe の子ウィンドウと親ウィンドウのメソッド呼び出し
2.1 文法使用法
1. 親ウィンドウに埋め込まれた iframe
2. 親ウィンドウは子ウィンドウのメソッド
を呼び出します。3. 子ウィンドウは親ウィンドウのメソッド
を呼び出します。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>
3. 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>
4. いくつかの重要なポイントをまとめてみましょう
親子ウィンドウ メソッドを呼び出すときは、望ましい結果を得るためにロードの順序に注意してください。問題が発生した場合は、多くの場合、alter() を使用してブラウザの開発者ツールをテストまたは監視できます。
以上の内容は、この記事のiframeの子親クラスウィンドウでJSを呼び出す方法と注意点です。