自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JavaScrip高級應(yīng)用:玩轉(zhuǎn)模態(tài)與非模態(tài)

開發(fā) 開發(fā)工具 前端
本文介紹如何使用JavaScript語言來創(chuàng)建這兩種類型的對話框、控制其大小和位置、改變其外觀以及在對話框間的數(shù)據(jù)傳遞。

我們知道,對話框一般分為兩種類型:模態(tài)類型(modal)與非模態(tài)類型(modeless)。所謂模態(tài)對話框,就是指除非采取有效的關(guān)閉手段,用戶的鼠標(biāo)焦點(diǎn)或者輸入光標(biāo)將一直停留在其上的對話框。

51CTO推薦閱讀:深入解讀JavaScript中BOM和DOM

非模態(tài)對話框則不會強(qiáng)制此種特性,用戶可以在當(dāng)前對話框以及其他窗口間進(jìn)行切換。本文的所有例子中,從層次上涉及到2個HTML頁面。我們把第一個頁面叫做caller頁面,第二個頁面叫做callee頁面。也就是說,在caller頁面執(zhí)行代碼創(chuàng)建生成callee頁面。

一、創(chuàng)建模態(tài)和非模態(tài)對話框

首先,我們舉個例子來快速了解一下什么是模態(tài)與非模態(tài)。在caller.htm中,我們輸入以下代碼:

  1. <INPUT TYPE="button" VALUE="創(chuàng)建模態(tài)對話框" onclick="fnOpenModal()">   
  2. <br><br>   
  3. <INPUT TYPE="button" VALUE="創(chuàng)建非模態(tài)對話框" onclick="fnOpenModeless()">   
  4. <script language="javascript">   
  5. function fnOpenModal(){   
  6. window.showModalDialog("callee.htm")   
  7. }   
  8. function fnOpenModeless(){   
  9. window.showModelessDialog("callee.htm")   
  10. }   
  11. </script>  

在瀏覽器中打開caller.htm,點(diǎn)擊“創(chuàng)建模態(tài)對話框”按鈕,將會出現(xiàn)一個對話框窗口,其中的內(nèi)容是callee.htm。你會看到,除了關(guān)閉這個新窗口,無論怎樣我們也不能將其他的窗口設(shè)置為“當(dāng)前活動”窗口,這個一直是活動狀態(tài)的窗口類型就是模態(tài)類型。

關(guān)閉這個模態(tài)對話框,回到caller.htm頁面,點(diǎn)擊“創(chuàng)建非模態(tài)對話框”,出現(xiàn)一個包含callee.htm頁面的對話框窗口。這回有所不同,鼠標(biāo)可以轉(zhuǎn)移到其他地方使另外的窗口成為“當(dāng)前活動”狀態(tài),這就是非模態(tài)的概念。接下來,我們看看創(chuàng)建模態(tài)對話框與非模態(tài)對話框的相關(guān)語法:

創(chuàng)建模態(tài)對話框:

  1. vReturnValue = window.showModalDialog(sURL [, vFreeArgument] [, sOrnaments]); 
  2.  

創(chuàng)建非模態(tài)對話框:

  1. vReturnValue = window.showModelessDialog(sURL [, vFreeArgument] [, sOrnaments]);
  2.   

從上面的語法我們得知:除了名字有所區(qū)別外,參數(shù)種類與含義都相同。以下是各參數(shù)的含義:

◆VReturnValue:對于showModalDialog(),它表示被打開的對話框窗口設(shè)置的returnValue屬性值。對于showModelessDialog(),它表示新窗口對象。
 
◆VFreeArgument:這個參數(shù)可用于傳遞某種類型的數(shù)據(jù)到打開的對話框,數(shù)據(jù)可以是一個數(shù)值、字符串、數(shù)組或者一個對象類型。在新窗口中引用這個數(shù)值時,可通過新創(chuàng)建window對象的dialogArguments屬性。 

◆SOrnaments:用這個參數(shù)指定新窗口的外觀??蛇x擇的窗口屬性有很多種,當(dāng)有多種控制需求時,將相關(guān)內(nèi)容用一個字符串連接起來,其間用分號隔開。以下是可選擇的屬性種類: 

  1. o dialogHeight: sHeight    
  2. o dialogLeft: sXpos    
  3. o dialogTop: sYpos    
  4. o dialogWidth: sWidth    
  5. o center: ( yes | no | 1 | 0 | on | off )    
  6. o dialogHide: ( yes | no | 1 | 0 | on | off )    
  7. o edge: ( sunken | raised )    
  8. o help: ( yes | no | 1 | 0 | on | off )    
  9. o resizable: ( yes | no | 1 | 0 | on | off )    
  10. o scroll: ( yes | no | 1 | 0 | on | off )    
  11. o status: ( yes | no | 1 | 0 | on | off )   

除了以上屬性外,我們還可以加入更加豐富的CSS控制。 以下我們來詳細(xì)解釋如何應(yīng)用這些屬性。

#p#

二、控制對話框大小和位置

控制對話框的大小和位置涉及到5個方面:高度(dialogHeight)、寬度(dialogWidth)、相對于桌面左上角的x坐標(biāo)(dialogLeft)、y坐標(biāo)(dialogTop)以及是否讓對話框窗口居中(center)。

由于不同版本的Internet Explorer瀏覽器處理的默認(rèn)度量單位并非一致,所以我們在指定高度、寬度等大小時,最好是同時設(shè)置好單位。單位種類包括很多,比如cm、mm、in、pt、pc、px。請注意:最小的高度值是100px。下面的代碼將打開一個高200px、寬800px的對話框:

  1. window.showModalDialog('callee.htm','','dialogHeight:200px;dialogWidth:800px');
  2.   

我們注意到,打開的新窗口會在桌面中處于居中的位置,這也正是居中屬性(center)的默認(rèn)值。居中屬性(center)的可取值包括yes、no、1、0、on和off,含義一目了然。執(zhí)行以下代碼,看看關(guān)閉居中屬性后新窗口的位置:

  1. window.showModalDialog('callee.htm','','dialogHeight:200px;dialogWidth:800px;center:no'); 
  2.  

我們看到,新窗口緊挨者桌面的左上角打開。當(dāng)然,我們可以使用dialogLeft和dialogTop 屬性來精確定義新窗口的打開位置。下面的代碼將在相對于桌面左上角的x位置300px和y位置500px處打開新窗口:

  1. window.showModalDialog('callee.htm','','dialogHeight:200px;  
  2. dialogWidth:800px;dialogLeft:300;   
  3. dialogTop:500') 


注意,即使指定了居中屬性,但如果同時設(shè)置了dialogLeft和dialogTop屬性值,那么窗口位置將遵從后者。試一試執(zhí)行下面的代碼:

  1. window.showModalDialog('callee.htm','','  
  2. dialogHeight:200px;dialogWidth:800px;dialogLeft:300;   
  3. dialogTop:500;center:yes') 

#p#
 

三、改變對話框外觀

對話框的外觀控制包括從窗口邊緣風(fēng)格(edge)、是否存在滾動條(scroll)、是否包含上下文關(guān)聯(lián)提示圖標(biāo)(help)、是否顯示狀態(tài)欄(status)以及是否可以改變窗口大?。╮esizable)等方面。默認(rèn)情況下,新打開的窗口是大小不可改變的、邊緣風(fēng)格為凸起、在新窗口右上角顯示一個上下文關(guān)聯(lián)提示圖標(biāo)、存在滾動條,比如:

edge的可取值為sunken(凹陷)和raised(凸起),status、help、resizeable和scroll的可取值都是yes、no、1、0、on和off,其含義一目了然。下面的代碼將去除上下文關(guān)聯(lián)提示圖標(biāo)、不顯示狀態(tài)欄、窗口邊緣風(fēng)格為凹陷:

  1. showModelessDialog("callee.htm","","status:0;help:0;edge:sunken"); 
  2.  

四、從caller頁面?zhèn)鬟f數(shù)據(jù)到callee頁面

上面我們介紹了創(chuàng)建模態(tài)和非模態(tài)窗口的語法以及如何控制新窗口的大小、位置和外觀,接下來我們研究一下實(shí)際應(yīng)用中更實(shí)用的功能:如何從caller頁面?zhèn)鬟f數(shù)據(jù)到callee頁面。從caller頁面?zhèn)鬟f給callee頁面的數(shù)據(jù)分為3類:傳遞值、傳遞數(shù)組引用以及傳遞對象,它們都是通過showModalDialog()和showModelessDialog()的第2個參數(shù)實(shí)現(xiàn)的。

(一)傳遞值類型數(shù)據(jù)

在caller.htm頁面中輸入以下代碼:

  1. <INPUT TYPE="button" VALUE="創(chuàng)建模態(tài)對話框" onclick="fnOpenModal()">   
  2. <br><br>   
  3. <INPUT TYPE="button" VALUE="創(chuàng)建非模態(tài)對話框" onclick="fnOpenModeless()">   
  4. <script language="javascript">   
  5. <!--   
  6. function fnOpenModal(){   
  7. window.showModalDialog("callee.htm","打開了一個新模態(tài)窗口")   
  8. }   
  9. function fnOpenModeless(){   
  10. window.showModelessDialog("callee.htm","打開了一個新非模態(tài)窗口")   
  11. }   
  12. // -->   
  13. </script>   
  14. 在callee.htm頁面中輸入以下代碼:   
  15. <SCRIPT LANGUAGE="JavaScript">   
  16. <!--   
  17. alert(dialogArguments);   
  18. // -->   
  19. </SCRIPT>  

在瀏覽器中打開caller.htm,點(diǎn)擊任意一個按鈕,我們將首先看到如下的提示信息框,然后才出現(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ù)。當(dāng)需要對caller.htm頁面的傳遞內(nèi)容進(jìn)行修改時,就需使用到數(shù)組引用類型的傳遞方式。首先,在caller.htm頁面中輸入以下代碼:

  1. <INPUT TYPE="button" VALUE="創(chuàng)建模態(tài)對話框" onclick="fnOpenModal()">   
  2. <br><br>   
  3. <INPUT TYPE="button" VALUE="創(chuàng)建非模態(tài)對話框" onclick="fnOpenModeless()">   
  4. <script language="javascript">   
  5. <!--   
  6. var a = new Array;   
  7. a[0]="first";   
  8. a[1]="second";   
  9. a[2]="third";   
  10. function fnOpenModal(){   
  11. window.showModalDialog("callee.htm",a)   
  12. }   
  13. function fnOpenModeless(){   
  14. window.showModelessDialog("callee.htm",a)   
  15. }   
  16. // -->   
  17. </script>   
  18. 然后在callee.htm頁面中輸入以下代碼:   
  19. <SCRIPT LANGUAGE="JavaScript">   
  20. <!--   
  21. a = dialogArguments;   
  22. alert(a);   
  23. a[0] = "fourth";   
  24. // -->   
  25. </SCRIPT> 

最后,在瀏覽器中打開caller.htm,點(diǎn)擊任意一個按鈕,我們將首先看到如下的對話框,接著關(guān)閉這個對話框以及新打開的窗口,再次點(diǎn)擊一個按鈕,又出現(xiàn)一個對話框,從運(yùn)行結(jié)果我們看到,在caller.htm頁面中通過對數(shù)組a的地址引用,就可以實(shí)現(xiàn)在callee.htm中修改數(shù)組a的內(nèi)容。 注意在callee.htm中要首先建立對傳遞數(shù)據(jù)的附值:a = dialogArguments。
 
(三)傳遞對象類型數(shù)據(jù)

在caller.htm和callee.htm中傳遞數(shù)據(jù)的最有效方式是通過對象方式進(jìn)行,這不僅能實(shí)現(xiàn)從caller.htm到callee.htm的傳遞,還能從callee.htm傳遞到caller.htm。而且,我們還可以在caller.htm中定義對象的方法,再在callee.htm中使用它們。實(shí)際上,我們可以將caller.htm的window對象傳遞給callee.htm,這樣就可以在callee.htm中訪問caller.htm的變量及函數(shù)。 來看看一個實(shí)際的例子。在caller.htm中輸入以下代碼:

  1. <HTML>   
  2. <HEAD>   
  3. <TITLE>傳遞對象數(shù)據(jù)</TITLE>   
  4. <SCRIPT>   
  5. var sColor="";    
  6. function callDialog() {   
  7. showModelessDialog("callee.html",window,"status:false;dialogWidth:300px;dialogHeight:150px");   
  8. }   
  9. function update()   
  10. {   
  11. oColor.innerText = sColor;   
  12. }   
  13.  
  14. </SCRIPT>   
  15. </HEAD>   
  16. <BODY>   
  17. <P>輸入你最喜歡的顏色: <SPAN ID="oColor" STYLE="color:red;font-size:24">Yellow</SPAN></P>    
  18. <INPUT TYPE="button" VALUE="Display Modeless Dialog" onclick="callDialog()">   
  19. </BODY>   
  20. </HTML>   
  21. 在callee.htm中輸入以下代碼:   
  22. <HTML>   
  23. <HEAD>   
  24. <TITLE>callee.html</TITLE>   
  25. <SCRIPT>   
  26. function getInfoAndUpdate() {   
  27. var callerWindowObj = dialogArguments;   
  28. callerWindowObj.sColor = oEnterColor.value;   
  29. callerWindowObj.update();   
  30. }   
  31.  
  32. function cancel() {   
  33. var callerWindowObj = dialogArguments;   
  34. callerWindowObj.sColor = "Yellow";   
  35. callerWindowObj.update();    
  36. }   
  37. </SCRIPT>   
  38. </HEAD>   
  39. <BODY>   
  40. 輸入你最喜歡的顏色:<INPUT ID=oEnterColor><BR><BR>   
  41. <INPUT VALUE="Apply" TYPE=button onclick="getInfoAndUpdate();">   
  42. <INPUT VALUE="Ok" TYPE=button onclick="getInfoAndUpdate();window.close();">   
  43. <INPUT VALUE="Cancel" TYPE=button onclick="cancel();window.close();">   
  44. </BODY>   
  45. </HTML> 

在瀏覽器中打開caller.htm,點(diǎn)擊“顯示非模態(tài)對話框”按鈕,出現(xiàn)新對話框,在對話框中輸入其他顏色名稱,點(diǎn)擊“Apply”按鈕后,執(zhí)行callee.htm中的getInfoAndUpdate函數(shù):

  1. function getInfoAndUpdate() {   
  2. var callerWindowObj = dialogArguments;   
  3. callerWindowObj.sColor = oEnterColor.value;   
  4. callerWindowObj.update();   
  5. }  

因?yàn)樵赾aller.htm中傳遞給callee.htm的是對象類型數(shù)據(jù)window,所以經(jīng)過第一條語句的附值,callerWindowObj就指向了caller.htm頁面,然后就可以在callee.htm中按照callerWindowObj.xxx的形式引用caller.htm中的變量及函數(shù):callerWindowObj.sColor = oEnterColor.value負(fù)責(zé)將callee.htm中輸入的顏色名稱傳遞給caller.htm中的變量sColor,然后再執(zhí)行caller.htm中的 update()函數(shù)更新顯示信息??梢钥吹?,通過對象方式傳遞數(shù)據(jù),功能很豐富強(qiáng)大,而且使用起來也不復(fù)雜。

結(jié)語

以上對使用JavaScript語言操作模態(tài)和非模態(tài)對話框進(jìn)行了詳細(xì)介紹,相信你又掌握了在html頁面中創(chuàng)建窗口的一個新技術(shù)。在實(shí)際應(yīng)用中,模態(tài)對話框的功能比較實(shí)用,可用于必須讓訪問者閱讀相關(guān)內(nèi)容的情況下。另外,利用對象方式在窗口間傳遞數(shù)據(jù),功能非常強(qiáng)大但使用卻不復(fù)雜,是非常值得一用的技術(shù)。

【編輯推薦】

  1. 深入解讀JavaScript中BOM和DOM
  2. 揭開Javascript閉包的真實(shí)面目
  3. 拔開云霧見明月 透析JavaScript定時機(jī)制
  4. 早該知道的7個JavaScript技巧
  5. 那些不為人熟知的JavaScript技巧

 

責(zé)任編輯:王曉東 來源: 博客園
相關(guān)推薦

2011-07-01 11:33:00

Qt 模態(tài) 非模態(tài)

2024-12-30 00:01:00

多模態(tài)大模型Python

2025-01-08 08:21:16

2024-10-29 11:54:25

2025-04-03 07:00:00

2025-04-07 00:00:00

多模態(tài)大模型

2024-05-21 07:54:30

視頻多模態(tài)語義檢索算法

2025-03-13 09:47:29

2024-12-26 01:20:53

多模態(tài)大模型圖片

2023-08-14 07:20:10

2024-11-11 15:11:23

2022-08-11 13:37:41

多模態(tài)算法多模態(tài)網(wǎng)絡(luò)

2024-11-13 09:39:13

2024-12-18 18:57:58

2025-01-02 08:36:25

多模態(tài)RAG深度學(xué)習(xí)自然語言處理

2024-11-27 14:00:00

模型訓(xùn)練

2023-05-28 23:26:16

多模態(tài)機(jī)器學(xué)習(xí)大腦

2024-03-25 12:30:18

AI訓(xùn)練開源

2025-03-19 09:30:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號