showModalDialog模態(tài)對(duì)話(huà)框的使用詳解以及瀏覽器兼容
1.ModalDialog是什么?
showModalDialog是jswindow對(duì)象的一個(gè)方法,和window.open一樣都是打開(kāi)一個(gè)新的頁(yè)面。
區(qū)別是:showModalDialog打開(kāi)子窗口后,父窗口就不能獲取焦點(diǎn)了(也就是無(wú)法操作了)。
可以在子窗口中通過(guò)設(shè)置window.returnValue的值,讓父窗口可以獲取這個(gè)returnvalue.
2.一個(gè)例子
1)主窗口main.html,
2)在主窗口中通過(guò)showModalDialog的方式打開(kāi)子窗口sub.html
3)在子窗口中設(shè)置returnValue返回給主窗口使用
main.html
<HTML>
<HEAD>
<METANAME="GENERATOR"Content="oscar999">
</HEAD>
<script>
functionshowmodal()
{
varret=window.showModalDialog("sub.html?temp="+Math.random());
alert("subreturnvalueis"+ret);
}
</script>
<BODY>
<INPUTid=button1type=buttonvalue="opensub"name=button1onclick="showmodal();">
</BODY>
</HTML>
sub.html
<HTML>
<HEAD>
<METANAME="GENERATOR"Content="oscar999">
</HEAD>
<script>
functionreturnMain()
{
window.returnValue="returnfromsub";
window.close();
}
</script>
<BODY>
<INPUTid=button1type=buttonvalue="returnandclose"name=button1onclick="returnMain()">
</BODY>
</HTML>
特別說(shuō)明:在main.html中showModalDialog的方法時(shí),有使用到Math.random()的目的是避免緩存。
3.showModalDialog詳細(xì)使用
vReturnValue=window.showModalDialog(sURL[,vArguments][,sFeatures])
sURL
必選參數(shù),類(lèi)型:字符串。用來(lái)指定對(duì)話(huà)框要顯示的文檔的URL。
vArguments
可選參數(shù),類(lèi)型:變體。用來(lái)向?qū)υ?huà)框傳遞參數(shù)。傳遞的參數(shù)類(lèi)型不限,包括數(shù)組等。對(duì)話(huà)框通過(guò)window.dialogArguments來(lái)取得傳遞進(jìn)來(lái)的參數(shù)。
sFeatures
可選參數(shù),類(lèi)型:字符串。用來(lái)描述對(duì)話(huà)框的外觀等信息,可以使用以下的一個(gè)或幾個(gè),用分號(hào)“;”隔開(kāi)。
dialogHeight對(duì)話(huà)框高度,不小于100px,IE4中dialogHeight和dialogWidth默認(rèn)的單位是em,而IE5中是px,為方便其見(jiàn),在定義modal方式的對(duì)話(huà)框時(shí),用px做單位。
dialogWidth:對(duì)話(huà)框?qū)挾取?BR>dialogLeft:距離桌面左的距離。
dialogTop:離桌面上的距離。
center:{yes|no|1|0}:窗口是否居中,默認(rèn)yes,但仍可以指定高度和寬度。
help:{yes|no|1|0}:是否顯示幫助按鈕,默認(rèn)yes。
resizable:{yes|no|1|0}[IE5+]:是否可被改變大小。默認(rèn)no。
status:{yes|no|1|0}[IE5+]:是否顯示狀態(tài)欄。默認(rèn)為yes[Modeless]或no[Modal]。
scroll:{yes|no|1|0|on|off}:指明對(duì)話(huà)框是否顯示滾動(dòng)條。默認(rèn)為yes。
還有幾個(gè)屬性是用在HTA中的,在一般的網(wǎng)頁(yè)中一般不使用。
dialogHide:{yes|no|1|0|on|off}:在打印或者打印預(yù)覽時(shí)對(duì)話(huà)框是否隱藏。默認(rèn)為no。
edge:{sunken|raised}:指明對(duì)話(huà)框的邊框樣式。默認(rèn)為raised。
unadorned:{yes|no|1|0|on|off}:默認(rèn)為no。
4.瀏覽器兼容
但是并不是所有瀏覽器對(duì)兼容這樣的用法。
在Chrome中運(yùn)行上面的例子的話(huà),父窗口可以任意獲取焦點(diǎn),效果和window.open一樣,而且獲取的returnVale也是undefined.
以下是各主流瀏覽器對(duì)此方法的支持狀況。
瀏覽器 | 是否支持 | 狀態(tài) |
IE9 | ○ | |
Firefox13.0 | ○ | |
safari5.1 | ○ | |
chrome19.0 | × | 并不是模態(tài)對(duì)話(huà)框,而是open了一個(gè)新窗體 |
Opera12.0 | × | 什么也發(fā)生,連個(gè)窗體都不彈 |
如果有傳入vArguments這個(gè)參數(shù)為window的話(huà):
var ret = window.showModalDialog("sub.html?temp="+Math.random(),window);
則在子窗口中,以下的值為:
瀏覽器 | 模態(tài)對(duì)話(huà)框 | window.opener | window.dialogArguments | returnValue |
IE9 | ○ | undefined | [object Window] | ○ |
Firefox13.0 | ○ | [objectWindow] | [object Window] | ○ |
safari5.1 | ○ | [objectWindow] | [object Window] | ○ |
chrome19.0 | × | [objectWindow] | undefined | × |
注意一下Firefox瀏覽器下,子窗體假如刷新的話(huà)window.dialogArguments照樣會(huì)丟失,變成undefined。以上結(jié)果中我們可以看出返回值returnValue就只有chrome瀏覽器返回的是undefined,其他瀏覽器都沒(méi)有問(wèn)題
5.如何解決Chrome的兼容問(wèn)題。
方向是:設(shè)置window.opener.returnValue=""
main.html
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="oscar999">
</HEAD>
<script>
function showmodal()
{
var ret = window.showModalDialog("sub.html?temp="+Math.random(),window);
//for Chrome
if(ret==undefined)
{
ret = window.returnValue;
}
alert("sub return value is "+ret);
}
</script>
<BODY>
<INPUT id=button1 type=button value="open sub" name=button1 onclick="showmodal();">
</BODY>
</HTML>
sub.html
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="oscar999">
</HEAD>
<script>
function returnMain()
{
if(window.opener!=undefined)
{
window.opener.returnValue = "return from sub";
}else{
window.returnValue = "return from sub";
}
window.close();
}
</script>
<BODY>
<INPUT id=button1 type=button value="return and close" name=button1 onclick="returnMain()">
</BODY>
</HTML>
這里是判斷某些對(duì)象是否為defined來(lái)區(qū)分瀏覽器。當(dāng)然,也可以判斷瀏覽器的類(lèi)型的方式進(jìn)行
這里是借用了父窗口的returnValue來(lái)使用, 如果父窗口的returnValue也用其他用途是可以使用替換的方式進(jìn)行了, as:
var oldValue = window.returnValue;
var newValue = showModalDialog()
window.returnValue = oldValue
6.需要特別注意的是,Chrome下的測(cè)試需要把html 文件放入到web server(Tomcat,...)下通過(guò)http url 訪(fǎng)問(wèn)測(cè)試。否則就不成功了。
- js模式化窗口問(wèn)題![window.dialogArguments]
- window.dialogArguments 使用說(shuō)明
- Chrome不支持showModalDialog模態(tài)對(duì)話(huà)框和無(wú)法返回returnValue問(wèn)題的解決方法
- JS在Chrome瀏覽器中showModalDialog函數(shù)返回值為undefined的解決方法
- 谷歌showModalDialog()方法不兼容出現(xiàn)對(duì)話(huà)窗口的解決辦法
- 谷歌瀏覽器不支持showModalDialog模態(tài)對(duì)話(huà)框的解決方法
- showModalDialog在谷歌瀏覽器下會(huì)返回Null的解決方法
- window.showModalDialog兩次加載問(wèn)題清除緩存方法
- Chrome中模態(tài)對(duì)話(huà)框showModalDialog返回值問(wèn)題的解決方法
相關(guān)文章
一個(gè)無(wú)限級(jí)XML綁定跨框架菜單(For IE)
一個(gè)無(wú)限級(jí)XML綁定跨框架菜單(For IE)...2007-01-01JavaScript中常用數(shù)據(jù)處理函數(shù)groupBy的用法詳解
數(shù)據(jù)處理與分析中,對(duì)數(shù)據(jù)進(jìn)行分組是非常常見(jiàn)的功能,不論是實(shí)際工作中,還是在面試的場(chǎng)景中應(yīng)用十分廣泛,尤其在函數(shù)式編程中?groupBy?十分常見(jiàn),下面我們就來(lái)學(xué)習(xí)一下groupBy的用法吧2023-12-12基于JavaScript創(chuàng)建動(dòng)態(tài)Dom
這篇文章主要介紹了基于JavaScript創(chuàng)建動(dòng)態(tài)Dom的相關(guān)資料,需要的朋友可以參考下2015-12-12JS實(shí)現(xiàn)兩個(gè)跨域頁(yè)面實(shí)現(xiàn)量子糾纏互動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript實(shí)現(xiàn)兩個(gè)跨域頁(yè)面實(shí)現(xiàn)量子糾纏互動(dòng)效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12js下關(guān)于onmouseout、事件冒泡的問(wèn)題經(jīng)驗(yàn)小結(jié)
第3次遇到這個(gè)問(wèn)題,于是總結(jié)了一下,將此短文發(fā)在首頁(yè),希望對(duì)瀏覽器事件機(jī)制有所了解的大俠們給予解答2010-12-12使用 JavaScript 在沒(méi)有插件的情況下輸入文本掩碼的示例詳解
這篇文章主要介紹了使用 JavaScript 在沒(méi)有插件的情況下輸入文本掩碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06