[Javascript]window.showModalDialog抓不到母視窗的問題
前言
showModalDialog抓母視窗物件的用法,請參考小喵大的文章:showModalDialog取得父視窗的語法
子視窗postback會另開視窗的問題,可以參考Danny叔叔的文章:showModalDialog 的使用
window.showModalDialog跟window.open最大的差異,就在一個是新開一個瀏覽器的視窗,一個則是像alert或confirm的對話視窗,
showModalDialog得關掉視窗,user才能點回去母視窗繼續作業。
而且showModalDialog是屬於client端開一個強迫回應視窗的方式,也就是client端處理完,ASP.NET才會回server端繼續執行Control event。
問題
有了前言的那些概念和技術背景,那怎麼還會抓不到母視窗的東西呢?
這情況以前我也沒碰到過,在家裡的環境也都沒問題,一直到系統上線後,才偶爾會發生這樣的問題。
showModalDialog的語法,有三個參數,
window.showModalDialog(strURL,self,sFeatures);
第一個參數:欲開窗的URL,就是我問題發生的原因。
因為這個系統的背景相當複雜,一台server上有九個IIS站台,而且彼此會互相呼叫,處理相關事務,
系統裡面摻雜了asp、ASP.NET 1.1、ASP.NET 2.0、ASP.NET 3.5、flash、jsp跟java。
以我的例子來說,showModalDialog欲開啟的網址,因為要呼叫別的IIS站台的程式,所以沒法用相對路徑的方式開啟。
所以我就使用『網址』的方式去開那一支asp程式。
結果發現在一些情況下,會有js error。
最後釐清問題的原因是,該系統對外公開有三個domain可以連進來,都是連到相同的系統和檔案,
而showModalDialog開窗的方式,當子視窗url與母視窗domain name不一樣時,一樣可以開窗,但是無法讀取到母視窗的物件。
window.dialogArguments會是Null。
(問題單裡面少了最重要的資訊『URL』,咖圖只有網頁內容,只有回報IE7才會有問題...差點沒暈倒)
釐清問題後,要解決問題就簡單多了。只要讓他們的domain一樣就好!
Solution
這個問題可以在Client端,也可以在Server端解決,只需要動態的串URL,替換domain name即可。
- Client端javascript取domain name的方式
- document.domain
- Server端ASP.NET取domain name的方式
- Request.Url.Authority
接著只需要把domain name與相對路徑網址,串到javascript showModalDialog函數的第一個參數即可。
結論
Trouble shooting真的找到問題比解決問題難上好幾倍,希望有過這樣的經驗之後,
可以幫助大家下次不會再被這種奇怪的問題困擾太久。
by the way, showModalDialog的視窗內容會被browser暫存,
解決方式請參考:http://social.msdn.microsoft.com/Forums/zh-TW/236/thread/e8f4baea-445b-4959-8a79-0ecbd9428d42
blog 與課程更新內容,請前往新站位置:http://tdd.best/