我們知道,對話框一般分為兩種類型:模態(tài)類型(modal)與非模態(tài)類型(modeless)。所謂模態(tài)對話框,就是指除非采取有效的關(guān)閉手段,用戶的鼠標焦點或者輸入光標將一直停留在其上的對話框。非模態(tài)對話框則不會強制此種特性,用戶可以在當前對話框以及其他窗口間進行切換。本文介紹如何使用JavaScript語言來創(chuàng)建這兩種類型的對話框、控制其大小和位置、改變其外觀以及在對話框間的數(shù)據(jù)傳遞。 |
本文的所有例程中,從層次上涉及到2個HTML頁面。我們把第一個頁面叫做caller頁面,第二個頁面叫做callee頁面。也就是說,在caller頁面執(zhí)行代碼創(chuàng)建生成callee頁面。 |
一、創(chuàng)建模態(tài)和非模態(tài)對話框 |
首先,我們舉個例子來快速了解一下什么是模態(tài)與非模態(tài)。在caller.htm中,我們輸入以下代碼: |
<INPUT TYPE="button" VALUE="創(chuàng)建模態(tài)對話框" onclick="fnOpenModal()"> |
<INPUT TYPE="button" VALUE="創(chuàng)建非模態(tài)對話框" onclick="fnOpenModeless()"> |
<script language="javascript"> |
window.showModalDialog("callee.htm") |
function fnOpenModeless(){ |
window.showModelessDialog("callee.htm") |
在瀏覽器中打開caller.htm,點擊“創(chuàng)建模態(tài)對話框”按鈕,將會出現(xiàn)一個對話框窗口,其中的內(nèi)容是callee.htm。你會看到,除了關(guān)閉這個新窗口,無論怎樣我們也不能將其他的窗口設(shè)置為“當前活動”窗口,這個一直是活動狀態(tài)的窗口類型就是模態(tài)類型。關(guān)閉這個模態(tài)對話框,回到caller.htm頁面,點擊“創(chuàng)建非模態(tài)對話框”,出現(xiàn)一個包含callee.htm頁面的對話框窗口。這回有所不同,鼠標可以轉(zhuǎn)移到其他地方使另外的窗口成為“當前活動”狀態(tài),這就是非模態(tài)的概念。 |
接下來,我們看看創(chuàng)建模態(tài)對話框與非模態(tài)對話框的相關(guān)語法: |
vReturnValue = window.showModalDialog(sURL [, vFreeArgument] [, sOrnaments]); |
vReturnValue = window.showModelessDialog(sURL [, vFreeArgument] [, sOrnaments]); |
從上面的語法我們得知:除了名字有所區(qū)別外,參數(shù)種類與含義都相同。以下是各參數(shù)的含義: |
· VReturnValue:對于showModalDialog(),它表示被打開的對話框窗口設(shè)置的returnValue屬性值。對于showModelessDialog(),它表示新窗口對象。 |
· VFreeArgument:這個參數(shù)可用于傳遞某種類型的數(shù)據(jù)到打開的對話框,數(shù)據(jù)可以是一個數(shù)值、字符串、數(shù)組或者一個對象類型。在新窗口中引用這個數(shù)值時,可通過新創(chuàng)建window對象的dialogArguments 屬性。 |
· SOrnaments:用這個參數(shù)指定新窗口的外觀。可選擇的窗口屬性有很多種,當有多種控制需求時,將相關(guān)內(nèi)容用一個字符串連接起來,其間用分號隔開。以下是可選擇的屬性種類: |
o center: ( yes | no | 1 | 0 | on | off ) |
o dialogHide: ( yes | no | 1 | 0 | on | off ) |
o edge: ( sunken | raised ) |
o help: ( yes | no | 1 | 0 | on | off ) |
o resizable: ( yes | no | 1 | 0 | on | off ) |
o scroll: ( yes | no | 1 | 0 | on | off ) |
o status: ( yes | no | 1 | 0 | on | off ) |
除了以上屬性外,我們還可以加入更加豐富的CSS控制。 以下我們來詳細解釋如何應(yīng)用這些屬性。 |
控制對話框的大小和位置涉及到5個方面:高度(dialogHeight)、寬度(dialogWidth)、相對于桌面左上角的x坐標(dialogLeft)、y坐標(dialogTop)以及是否讓對話框窗口居中(center)。由于不同版本的Internet Explorer瀏覽器處理的默認度量單位并非一致,所以我們在指定高度、寬度等大小時,最好是同時設(shè)置好單位。單位種類包括很多,比如cm、mm、in、pt、pc、px。請注意:最小的高度值是100px。 |
下面的代碼將打開一個高200px、寬800px的對話框: |
window.showModalDialog('callee.htm','','dialogHeight:200px;dialogWidth:800px'); |
我們注意到,打開的新窗口會在桌面中處于居中的位置,這也正是居中屬性(center)的默認值。居中屬性(center)的可取值包括yes、no、1、0、on和off,含義一目了然。執(zhí)行以下代碼,看看關(guān)閉居中屬性后新窗口的位置: |
window.showModalDialog('callee.htm','','dialogHeight:200px;dialogWidth:800px;center:no'); |
我們看到,新窗口緊挨者桌面的左上角打開。當然,我們可以使用dialogLeft和dialogTop 屬性來精確定義新窗口的打開位置。下面的代碼將在相對于桌面左上角的x位置300px和y位置500px處打開新窗口: |
window.showModalDialog('callee.htm','','dialogHeight:200px;dialogWidth:800px;dialogLeft:300; dialogTop:500') |
注意,即使指定了居中屬性,但如果同時設(shè)置了dialogLeft和dialogTop屬性值,那么窗口位置將遵從后者。試一試執(zhí)行下面的代碼: |
window.showModalDialog('callee.htm','','dialogHeight:200px;dialogWidth:800px;dialogLeft:300; dialogTop:500;center:yes') |
對話框的外觀控制包括從窗口邊緣風格(edge)、是否存在滾動條(scroll)、是否包含上下文關(guān)聯(lián)提示圖標(help)、是否顯示狀態(tài)欄(status)以及是否可以改變窗口大?。╮esizable)等方面。默認情況下,新打開的窗口是大小不可改變的、邊緣風格為凸起、在新窗口右上角顯示一個上下文關(guān)聯(lián)提示圖標、存在滾動條,比如: |
edge的可取值為sunken(凹陷)和raised(凸起),status、help、resizeable和scroll的可取值都是yes、no、1、0、on和off,其含義一目了然。 |
下面的代碼將去除上下文關(guān)聯(lián)提示圖標、不顯示狀態(tài)欄、窗口邊緣風格為凹陷: |
showModelessDialog("callee.htm","","status:0;help:0;edge:sunken"); |
四、從caller頁面?zhèn)鬟f數(shù)據(jù)到callee頁面 |
上面我們介紹了創(chuàng)建模態(tài)和非模態(tài)窗口的語法以及如何控制新窗口的大小、位置和外觀,接下來我們研究一下實際應(yīng)用中更實用的功能:如何從caller頁面?zhèn)鬟f數(shù)據(jù)到callee頁面。 |
從caller頁面?zhèn)鬟f給callee頁面的數(shù)據(jù)分為3類:傳遞值、傳遞數(shù)組引用以及傳遞對象,它們都是通過showModalDialog()和showModelessDialog()的第2個參數(shù)實現(xiàn)的。 |
<INPUT TYPE="button" VALUE="創(chuàng)建模態(tài)對話框" onclick="fnOpenModal()"> |
<INPUT TYPE="button" VALUE="創(chuàng)建非模態(tài)對話框" onclick="fnOpenModeless()"> |
<script language="javascript"> |
window.showModalDialog("callee.htm","打開了一個新模態(tài)窗口") |
function fnOpenModeless(){ |
window.showModelessDialog("callee.htm","打開了一個新非模態(tài)窗口") |
<SCRIPT LANGUAGE="JavaScript"> |
在瀏覽器中打開caller.htm,點擊任意一個按鈕,我們將首先看到如下的提示信息框: |
然后才出現(xiàn)新窗口。這種情況下,callee.htm頁面中的window對象的屬性dialogArguments將對應(yīng)于caller.htm頁面中的"打開了一個新模態(tài)窗口"或者"打開了一個新非模態(tài)窗口"。如果直接打開callee.htm,將會出現(xiàn)錯誤提示。 |
(二)傳遞數(shù)組引用類型數(shù)據(jù) |
第一種值類型數(shù)據(jù)的傳遞中,在callee.htm頁面中只能讀取caller.htm頁面的傳遞數(shù)據(jù)。當需要對caller.htm頁面的傳遞內(nèi)容進行修改時,就需使用到數(shù)組引用類型的傳遞方式。 |
<INPUT TYPE="button" VALUE="創(chuàng)建模態(tài)對話框" onclick="fnOpenModal()"> |
<INPUT TYPE="button" VALUE="創(chuàng)建非模態(tài)對話框" onclick="fnOpenModeless()"> |
<script language="javascript"> |
window.showModalDialog("callee.htm",a) |
function fnOpenModeless(){ |
window.showModelessDialog("callee.htm",a)
|
h=100% >
|
} |