首頁 >web前端 >js教程 >iframe中子父類別視窗呼叫JS的方法及注意事項_javascript技巧

iframe中子父類別視窗呼叫JS的方法及注意事項_javascript技巧

WBOY
WBOY原創
2016-05-16 15:42:591706瀏覽

一、前言

我頁面用的是EasyUI的彈出視窗裡面嵌入一個iframe。

第一:父視窗開啟子視窗是一個新增使用者資訊的iframe子頁面,點選儲存後,子視窗iframe則去呼叫父視窗的function closeAddWindow()方法,讓父視窗去關閉新增頁面;

第二:父窗口打開一個設定用戶權限的iframe子窗口,首先打開這個子窗口會全部加載資料庫表中所有的存在的權限,然後子窗口需要把加載的權限信息拼接html  Append到一個ID在

上,這裡有個問題就是父視窗開啟子視窗載入所有權限後根本無法把html 追加到id="tb"的表格上,這個原因很簡單,因為父視窗調用子視窗載入所有權限資訊的後,沒有找到表格元素,因為子頁面還沒有完全載入完成,這種情況處理在這裡也介紹了,給iframe註冊一個onload事件,等載入完成後再去調用追加的方法。

好了,簡單到這裡,讓我們瞧瞧更多的例子吧! ! ~~~~~~(*^__^*) 嘻嘻……

二、iframe子父視窗方法呼叫

2.1文法使用

1、父視窗嵌入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&#63;UserID=" + data.UserID + "' width='100%' height='100%' frameborder='0'></iframe>");
      //错误做法!:上面src='RoleUsers_Update.aspx&#63;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的方法及注意事項,希望大家喜歡。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn