1. 程式人生 > >JavaScript 父子頁面相互呼叫總結

JavaScript 父子頁面相互呼叫總結

父子頁面相互呼叫是一個在開發中經常遇到的問題,但是沒有找到過比較全面的文章介紹。在此總結下來,供大家參考。

四種方式

       一般情況下,我們可以使用iframe、window的open、showModalDialog、showModelessDialog方法這四種方式開啟一個子視窗。(showModalDialog、showModelessDialog是IE獨有的。)

下面分這四種方式來討論如何父子頁面互相呼叫。

分情況討論

iframe

在這種情況下,子頁面直接通過parent.var就可以對父頁面的變數和方法進行操作。

父頁面可以通過拿到iframe的contentWindow物件來訪問子頁面的window。

父頁面程式碼,檔名為iframe.html。

<html>

<head>

       <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

       <title></title>

</head>

<body>

       <script>

              var testVar = "我是父視窗測試變數";

              var childFrame;

              function getChildVar(){

                     var childFrame = document.getElementById("childFrame");

                     var childWindow = childFrame.contentWindow

                     alert(childWindow.testVar);

              }

       </script>

       <iframe id="childFrame" name="childFrame" frameBorder="0" src="iframe.child.html" style="border:1px solid black;">

       </iframe>

       <br />

       <button onclick="getChildVar();">拿到子頁面的變數</button>

</body>

</html>

子頁面程式碼,檔名為iframe.child.html。

<html>

<head>

       <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

       <title></title>

</head>

<body>

       <script>

              var testVar = "我是子視窗測試變數";

       </script>

       我是在IFrame中的子窗體。

       <button onclick="alert(parent.testVar);">拿到父頁面的testVar</button>

</body>

</html>

open

使用window.open開啟的子頁面,在子頁面中可以通過window.opener來訪問父頁面的window物件。

在父頁面中,可以通過window.open方法的返回值拿到子頁面的window,就可以操作子頁面的變數和方法。

父頁面程式碼,檔名為window.open.html。

<html>

<head>

       <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

       <title>window.open父頁面</title>

</head>

<body>

       <script>

              var testVar = "我是父視窗測試變數";

              var childFrame;

              function openWindow(){

                     childFrame = window.open("window.open.child.html");

              }

              function getChildVar(){

                     alert(childFrame.testVar);

              }

       </script>

       <button onclick="openWindow();">使用window.open開啟子頁面</button>

       <button onclick="getChildVar();">拿到子頁面的變數</button>

</body>

</html>

子頁面程式碼,檔名為window.open.child.html。

<html>

<head>

       <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

       <title>window.open子頁面</title>

</head>

<body>

       <script>

              var testVar = "我是子視窗測試變數";

              alert(window.opener.testVar);

       </script>

</body>

</html>

showModalDialog

使用showModalDialog開啟的子頁面,如果想訪問父頁面的window,需要在執行showModalDialog方法的時候,把父頁面的window當作引數傳遞過去。見父頁面的程式碼。

因為showModalDialog是阻塞的,父頁面的程式碼在子頁面不關閉之前無法繼續執行,所以只能通過returnValue拿到子頁面的變數,見子頁面的程式碼。

父頁面程式碼,檔名為ShowModalDialog.html。

<html>

<head>

       <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

       <title>ShowModalDialog父頁面</title>

</head>

<body>

       <script>

              var testVar = "我是父視窗測試變數";

              function openDialog(){

                     var testVar = showModalDialog("ShowModalDialog.Child.html",window);

                     alert(testVar);

              }

       </script>

       <button onclick="openDialog();">OpenDialog</button>

</body>

</html>

子頁面程式碼,檔名為ShowModalDialog.Child.html。

<html>

<head>

       <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

       <title>ShowModalDialog子頁面</title>

</head>

<body>

       <script>

              var testVar = "我是子視窗測試變數";

              function getParent(){

                     var parentWindow = window.dialogArguments;

                     alert(parentWindow.testVar);

              }

              function closeMe(){

                     returnValue = testVar;

                     window.close();

              }

       </script>

       我是使用ShowModalDialog開啟的子頁面。

       <br />

       <button onclick="getParent()">getParent</button>

       <button onclick="closeMe()">closeMe</button>

</body>

</html>

showModelessDialog

使用showModelessDialog開啟的子頁面,同樣需要在執行方法的時候,把父頁面的window當作引數傳遞過去。

但不同之處在於showModelessDialog會直接返回子頁面的window物件,不是阻塞的,可以直接對子頁面的方法和變數進行訪問。

父頁面程式碼,檔名為ShowModelessDialog.html:

<html>

<head>

       <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

       <title>ShowModalDialog父頁面</title>

</head>

<body>

       <script>

              var testVar = "我是父視窗測試變數";

              function openDialog(){

                     var childWindow = showModelessDialog("ShowModelessDialog.Child.html",window);

                     alert(childWindow.testVar);

              }

       </script>

       <button onclick="openDialog();">OpenDialog</button>

</body>

</html>

子頁面程式碼,檔名為ShowModelessDialog.html。

<html>

<head>

       <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

       <title>ShowModalDialog子頁面</title>

</head>

<body>

       <script>

              var testVar = "我是子視窗測試變數";

              function getParent(){

                     var parentWindow = window.dialogArguments;

                     alert(parentWindow.testVar);

              }

              function closeMe(){

                     returnValue = testVar;

                     window.close();

              }

       </script>

       我是使用ShowModalDialog開啟的子頁面。

       <br />

       <button onclick="getParent()">getParent</button>

       <button onclick="closeMe()">closeMe</button>

</body>

</html>