[Javascript]window.showModalDialog抓不到母視窗的問題

  • 17747
  • 0

[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/