模態對話框(Modal Dialog),是一種會block順序執行程序的窗口,比如C#裏的MessageBox.Show(this,...),JavaScript裏的alert(...)、confirm(...)等,是我們最常見的模態對話框。不關閉這種對話框程序的當前線程就被一直掛起了,這種窗口的特性最適合用來做條件分支的判斷提示和Wizard窗口。
在IE裏面,我們可以通過window對象的showModalDialog方法十分方便的開啓一個模態對話框。可是這個從IE4.0就開始支持的feature,居然還有一堆一堆的問題:( 比如:點超級鏈接或Submit按鈕會開啓新窗口啊,不能使用F5刷新啊,拿不到模態窗口的opener啊,等等。不過這些老問題繞來繞去都還算是被解決了。剩下的什麼怎麼在模態窗口間傳出傳入參數啊,怎麼執行其opener裏的方法啊,怎麼關閉啊,就屬於沒有好好看msdn和對DHTML的不熟悉了。
今天一不小心又發現一個模態對話框讓人抓狂的問題,不能在裏面使用XMLHTTP對象獲取服務器數據,一調用就立刻返回空字符串。搞了半天找不到原因,於是囉裏囉唆的把模態對話框的父窗口傳到對話框內,把調用XMLHTTP對象的程序從模態窗口裏原樣移到父窗口裏,從模態窗口去調父窗口裏的方法,結果一下就取到服務器上的數據了。到這裏我還以爲找到模態對話框的bug了,回家後決定把這個bug再研究一下,結果卻很順利的從模態窗口裏調用XMLHTTP對象獲得了服務器上的數據。真是鬱悶!!!
明天再找個機器來試試,看看到底還有沒有問題。
如果你對JS也感興趣,不妨也來試驗一下,看看到底是我機器環境本身的原因,還是這是一個不確定的bug。
測試代碼如下:
<head>
<title>Caller</title>
</head>
<body>
<button onclick="OpenDialog()">Open Dialog
</button>
<script language="javascript">
function OpenDialog()
{
var dlg = window.showModalDialog('Callee.htm');
}
</script>
</body>
</html>
存爲:Caller.htm
<head>
<title>Callee</title>
</head>
<body>
<table border="0" width="100%" height="100%">
<tr>
<td align="center" valign="middle">
<button onclick="GetData()" ID="Button1">Open Dialog
</button></td>
</tr>
</table>
<script language="javascript">
function GetData()
{
var url = 'http://www.google.com';
__XmlHttpPool__.GetRemoteData(url, alert);
}
</script>
<script language="javascript"></script>
</body>
</html>
存爲:Callee.htm
歡迎回復您的實驗結果,同時也歡迎討論模態窗口的其它問題及解決方法。