1. 程式人生 > >模式視窗window.showModalDialog()的用法

模式視窗window.showModalDialog()的用法

模式視窗的用法
一、問題:

    我想彈出一個視窗,然後在彈出的窗口裡,選擇或輸入一些資訊,要求這些資訊返回到父頁面。
建立父頁面:a.htm

<html>
<head>
    <title></title>
    <mce:script language="javascript" type="text/javascript"><!--
        function OpenWin()
        {
            var getv = showModalDialog("b.htm", "", "dialogWidth:320px; dialogHeight:200px;status:no;help:yes");
            if (getv != null)
            {
                document.forms[0].txtName.value=getv.split(",")[0];;
                document.forms[0].txtAge.value=getv.split(",")[1];;
            }
        }
    
// --></mce:script>
</head>
<body>
    <form id="form1" runat="server" method="post">
    <input type="text" name="txtName" id="txtName" />
    <input type="text" name="txtAge" id="txtAge" />
    <input type="button" name="Submit" value="開啟" onclick="OpenWin()" />
    </form>
</body>
</html>

建立子頁面:b.htm

<html>
<head>
    <title></title>

    <mce:script language="javascript" type="text/javascript"><!--
        function GetValue()
        {
            //window.returnValue存放子視窗向父視窗所傳值的內容
            window.returnValue=document.forms[0].txtName.value+","+document.forms[0].txtAge.value;
            window.close();
        }
    
// --></mce:script>

</head>
<body>
    <form id="form1" runat="server" method="post">
    <br />
    姓名:<input name="txtName" type="text" id="txtName" /><br />
    年齡:<input name="txtAge" type="text" id="txtAge" />
    <input type="button" name="Submit" value="關閉" onclick="GetValue()" />
    </form>
</body>
</html>

這裡利用了模式視窗window.showModalDialog(),利用window.returnValue = window.showModalDialog(sURL [, vArguments] [, sFeatures]),我們可以開啟一個模態視窗,該視窗的優點是限制使用者只能對當前的頁面進行操

作,而對其父頁面不能進行操作,常用於嚮導或者資訊獲取頁面。利用其中的vArguments我們可以在父頁面和彈出的頁面中進行引數的傳遞,引數可以為自定義的物件,也可以傳遞父頁面中任何一個控制元件的引用,這使得我們可以很容

易的來操作父頁面中的各個元素,使得引數的傳遞變得非常容易。

二、第2個引數的討論
showModalDialog("子頁面地址","向子頁面傳遞引數","子頁面外觀設定"),關於引數的詳細設定看最後的註釋,這裡主要研究下第2個引數。
1.第2個引數為自定義物件

我們可以定義一個javascript物件,然後定義各種自定義屬性的值,然後可以將此物件傳遞到子頁面中。
例:將父頁面的資訊封裝成一個物件,然後將該物件傳遞給子頁面。
父頁面:oneParent.htm

<html>
<head>
    <title>父頁面向子頁面傳遞自定義物件引數</title>
    <mce:script language="javascript" type="text/javascript"><!--
        function OpenWin()
        {
            //傳送頁面,利用模式視窗的第2個引數向子頁面傳遞一個物件
            var person=new Object();
            person.myName=document.forms[0].txtName.value;
            person.myAge=document.forms[0].txtAge.value;
            window.showModalDialog("oneSon.htm",person,""); //第2個引數是一個物件
        }
    
// --></mce:script>
</head>
<body>
    <form id="form1" runat="server" method="post">
        姓名:<input type="text" name="txtName" id="txtName" />
        年齡:<input type="text" name="txtAge" id="txtAge" />
        <input type="button" name="Submit" value="開啟" onclick="OpenWin()" />
    </form>
</body>
</html>

子頁面:oneSon.htm

<html>
<head>
    <title></title>

    <mce:script language="javascript" type="text/javascript"><!--
       window.onload=function(){
            //對話方塊通過window.dialogArguments來取得傳遞進來的引數。   
            var person=window.dialogArguments;
            document.forms[0].txtName.value=person.myName;
            document.forms[0].txtAge.value=person.myAge;
        };
    
// --></mce:script>
</head>
<body>
    <form id="form1" runat="server" method="post">
    <br />
    姓名:<input name="txtName" type="text" id="txtName" /><br />
    年齡:<input name="txtAge" type="text" id="txtAge" />
    <input type="button" name="Submit" value="關閉" onclick="window.close()" />
    </form>
</body>
</html>

 以上程式碼中,文件全部載入完,才執行window.onload指定函式,以找到document.forms[0].txtName物件,如果去掉,window.onload=function(){}直接寫大括號裡的程式碼,則必須把這個JS程式碼塊房到</body>之後才能正確執行,否則出現執行時間錯誤,找不到document.forms[0].txtName物件

2.第2個引數是父頁面的一個元素
我們可以將父頁面中元素物件的引用傳遞給子頁面,通過該引用我們可以訪問父頁面中的該元素物件。
例:其中利用元素物件的引用我們可以操縱父頁面的元素物件的屬性。
父頁面:twoParent.htm

<html>
<head>
    <title>父頁面向子頁面傳遞父頁面元素</title>

    <mce:script language="javascript" type="text/javascript"><!--
        function OpenWin()
        {
            //傳送頁面,利用模式視窗的第2個引數向子頁面傳遞一個物件
            window.showModalDialog("twoSon.htm",parentDiv,""); //第2個引數是父頁面中的元素物件
        }
    
// --></mce:script>

</head>
<body>
    <form id="form1" runat="server" method="post">
    <div id="parentDiv">
        姓名:<input type="text" name="txtName" id="txtName" />
        年齡:<input type="text" name="txtAge" id="txtAge" />
        <input type="button"  value="開啟" onclick="OpenWin()" />
    </div>
    </form>
</body>
</html>

子頁面:twoSon.htm

<html>
<head>
    <title></title>

    <mce:script language="javascript" type="text/javascript"><!--
//       window.onload=function(){
            //對話方塊通過window.dialogArguments來取得傳遞進來的引數。   
            var infoKeYi=window.dialogArguments;
//        };
    
// --></mce:script>
</head>
<body>
    <form id="form1" runat="server" >
    <div id="childDiv">
    </div>
    <br />
    <!-- 註釋:顯示傳遞進來的,父頁面中的元素資訊-->
    <input type="button" value="顯示父頁面傳遞的資訊" onclick="childDiv.innerHTML=infoKeYi.innerHTML" />
    <input type="button" value="子頁面操作父頁面的資訊", onclick='infoKeYi.style.backgroundColor="green"'/>
    <!-- 註釋:顯示傳遞進來的父元素資訊-->
    <input type="button" name="Submit" value="關閉" onclick="window.close()" />
    </form>
</body>
</html>

      這裡註釋掉window.onload=function(){},直接寫大括號裡的程式碼,目的讓JS程式碼先載入,後加載<body>裡的元素,否則出現找不到物件infoKeYi的錯誤。

3.第2個引數是window.
如果第2個引數是window,這樣可以取得父視窗的一些資料和方法。如:
//取得父視窗的JS變數 var
window.dialogArguments.父視窗中的變數;
//獲得父視窗的物件和屬性
window.dialogArguments.form1.父視窗中控制元件name.value ;
//呼叫父視窗的方法 fun
window.dialogArguments.父視窗中的方法 ;
父頁面:threeParent.htm

<html>
<head>
    <title>父頁面向子頁面傳遞父頁面元素</title>
    <mce:script language="javascript" type="text/javascript"><!--
        //開啟視窗
        function OpenWin()
        {
            window.showModalDialog("threeSon.htm",window,"dialogWidth:300px;dialogHeight:200px;status:no"); //第2個引數是window物件
        }
        //定義一個子視窗要呼叫的變數
        var age=20;
        //定義一個子視窗要呼叫的方法
        function getHello()
        {
            return "你好,世界!";
        }
    
// --></mce:script>
</head>
<body>
    <form id="form1" runat="server" method="post">
    <div id="parentDiv" align="center">
        姓名:<input type="text" name="txtName" id="txtName" />
        <input type="button"  value="開啟" onclick="OpenWin()" />
    </div>
    </form>
</body>
</html>

子頁面:threeSon.htm

<html>
<head>
    <title></title>

    <mce:script language="javascript" type="text/javascript"><!--
       window.onload=function(){
            //對話方塊通過window.dialogArguments來取得傳遞進來的引數。   
            
            //獲得父視窗的物件和屬性
            document.forms[0].txtName.value=window.dialogArguments.form1.txtName.value;
            //取得父視窗的JS變數
            document.forms[0].txtAge.value=window.dialogArguments.age;
            //呼叫父視窗的方法
            document.forms[0].txtSay.value=window.dialogArguments.getHello();
        };
    
// --></mce:script>
</head>
<body>
    <form id="form1" runat="server" >
    <div id="childDiv" align="center">
    </div>
    <br />
    <!-- 註釋:顯示傳遞進來的,父頁面中的元素資訊-->
    姓名:<input name="txtName" type="text" id="txtName" /><br />
    年齡:<input name="txtAge" type="text" id="txtAge" /><br />
    問候:<input name="txtSay" type="text" id="txtSay" /><br />
    <input type="button" name="Submit" value="關閉" onclick="window.close()" />
    </form>
</body>
</html>

三、註釋:
1、window.open()引數:
例如:

<SCRIPT LANGUAGE="javascript">
<!--
    window.open ('page.html', 'newwindow', 'height=100, width=400, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no')
//寫成一行
-->
</SCRIPT>
 引數解釋:
<SCRIPT LANGUAGE="javascript"> js指令碼開始;
   window.open 彈出新視窗的命令;
   'page.html' 彈出視窗的檔名;
   'newwindow' 彈出視窗的名字(不是檔名),非必須,可用空''代替;
   height=100 視窗高度;
   width=400 視窗寬度;
   top=0 視窗距離螢幕上方的象素值;
   left=0 視窗距離螢幕左側的象素值;
   toolbar=no 是否顯示工具欄,yes為顯示;
   menubar,scrollbars 表示選單欄和滾動欄。
   resizable=no 是否允許改變視窗大小,yes為允許;
   location=no 是否顯示位址列,yes為允許;
   status=no 是否顯示狀態列內的資訊(通常是檔案已經開啟),yes為允許;
</SCRIPT>

2、window.showModalDialog()引數:
vReturnValue=window.showModalDialog(sURL    [,    vArguments]    [,sFeatures])  
例如:

<SCRIPT LANGUAGE="javascript">
<!--
    window.showModalDialog('Ori_Photo.aspx','','resizable:yes;scroll:yes;status:no;dialogWidth=320px;dialogHeight=230px;center=yes;help=no');
//寫成一行
-->
</SCRIPT>

引數說明:  
   sURL--  
   必選引數,型別:字串。用來指定對話方塊要顯示的文件的URL。  
   vArguments--  
   可選引數,型別:變體。用來向對話方塊傳遞引數。傳遞的引數型別不限,包括陣列等。對話方塊通過window.dialogArguments來取得傳遞進來的引數。  
   sFeatures--  
   可選引數,型別:字串。用來描述對話方塊的外觀等資訊,可以使用以下的一個或幾個,用分號“;”隔開。  
   1.dialogHeight    :對話方塊高度,不小於100px,IE4中dialogHeight    和    dialogWidth    預設的單位是em,而IE5中是px,為方便其見,在定義modal方式的對話方塊時,用px做單位。  
   2.dialogWidth:    對話方塊寬度。  
   3.dialogLeft:    離螢幕左的距離。  
   4.dialogTop:    離螢幕上的距離。  
   5.center:    {yes|no|1|0}:視窗是否居中,預設yes,但仍可以指定高度和寬度。  
   6.help:    {yes|no|1|0}:是否顯示幫助按鈕,預設yes。  
   7.resizable:    {yes|no|1|0}    [IE5+]:是否可被改變大小。預設no。  
   8.status:    {yes|no|1|0}    [IE5+]:是否顯示狀態列。預設為yes[    Modeless]或no[Modal]。  
   9.scroll:{    yes|no|1|0|on|off}:指明對話方塊是否顯示滾動條。預設為yes。  
   下面幾個屬性是用在HTA中的,在一般的網頁中一般不使用。  
   10.dialogHide:{    yes|no|1|0|on|off}:在列印或者列印預覽時對話方塊是否隱藏。預設為no。  
   11.edge:{    sunken|raised}:指明對話方塊的邊框樣式。預設為raised。  
   12.unadorned:{    yes|no|1|0|on|off}:預設為no。