最近項目又用.net伺服器控制項真不爽!
發現在chrome瀏覽器下showModalDialog方法顯示的並不是模態對話方塊,就像新開啟一個頁面一樣,父視窗仍然可以隨意擷取焦點,並可以開啟多個表單,而且傳回值returnValue也無法返回,一直是undefined。這麼多問題很令人頭疼,下面就各個主流最新版的瀏覽器進行了一下測試。
| 瀏覽器 |
是否支援 |
狀態 |
| IE9 |
○ |
|
| Firefox13.0 |
○ |
|
| safari5.1 |
○ |
|
| chrome19.0 |
× |
並不是模態對話方塊,而是open了一個新表單 |
| Opera12.0 |
× |
什麼也發生,連個表單都不彈 |
Chrome到底開啟的是什麼
因為開啟的不是模態對話方塊,而是像open了一個新表單一樣,那隻要驗證一下子表單window.opener是否為空白就明白了。
<script type="text/javascript"> alert(window.opener);</script>
在chrome中,顯示的是一個[object window]對象,而IE則是undefined。現在知道原來chrome將showModalDialog當作window.open來處理了。也就是說我們完全可以用window.opener來操作chrome瀏覽器下子表單。這裡還發現個很有趣的現象,firefox中測試window.opener也並不為空白,於是我又測試了下使用showModalDialog在子表單中關於window.opener和window.dialogArguments在各個瀏覽器裡的狀況,由於Opera瀏覽器連個表單都不彈,下面測試就剔除它了。
說明下父表單的showModalDialog的方法中arguments傳遞是window對象,下面是測試的結果:
| 瀏覽器 |
模態對話方塊 |
window.opener |
window.dialogArguments |
returnValue |
| IE9 |
○ |
undefined |
[object Window] |
○ |
| Firefox13.0 |
○ |
[object Window] |
[object Window] |
○ |
| safari5.1 |
○ |
[object Window] |
[object Window] |
○ |
| chrome19.0 |
× |
[object Window] |
undefined |
× |
以上是我測試的結果,各個瀏覽器所支援的程度還是不一樣的。還要說一下Firefox瀏覽器下,子表單假如重新整理的話window.dialogArguments照樣會丟失,變成undefined。以上結果中我們可以看出傳回值returnValue就只有chrome瀏覽器返回的是undefined,其他瀏覽器都沒有問題。那該如何解決這個問題呢?
解決returnValue問題
通過以上的種種測試,我們已經知道chrome的showModalDialog方法很像執行了window.open方法,那麼我們可以利用window.opener來實現window.returnValue的功能。
注意:temp=Math.random()這個隨機參數是為瞭解決緩衝問題,不少朋友測試出undefined是因為是緩衝的問題。 追加於2012-10-17
父表單部分js代碼:
window.onload = function () { var returnValue = window.showModalDialog("son.html?temp=" + Math.random(), window); //for chrome if (returnValue == undefined) { returnValue = window.returnValue; } alert(returnValue);}
子表單部分js代碼:
if (window.opener != undefined) { //for chrome window.opener.returnValue = "opener returnValue";}else { window.returnValue = "window returnValue";}window.close();
這樣也在IE,FireFox,Chrome,Safari等瀏覽器下都可以通用了。