這陣子一直被一個問題所苦,有個放在Modal Dialog中的ASPX,在送出時會另開新視窗。這類問題在我的Modal Dialog Mini FAQ中有提過,只要加個<base target="_self">就可以擺平。

為了怕開發人員忘了主動加上,我的做法是由Custom WebControl在網頁加入以下的Code:

//ShowModalDialog模式時,強迫將Base Target設為_self;
if (window.dialogArguments) {
    var oBaseColl = document.all.tags('BASE');
    if (oBaseColl && oBaseColl.length) oBaseColl[0].target='_self';
    else {
        var oBase=document.createElement('BASE');
        oBase.target='_self';
        document.getElementsByTagName('head')[0].appendChild(oBase);
    }
}

怎樣? 很聰明吧? Script會自動判斷是否在Modal Dialog中,然後在<head>區設定或加上<base target="_self">, 有時我還真佩服自己~~~ XD

只可惜,百密一疏,以上的寫法有個漏洞。雖然我已確定window.showModalDialog()時都會傳入window Object做為參數,以便在Modal Dialog中可以用window.dialogArguments取得呼叫端的DOM。因此我順理成章地檢查window.dialogArguments來決定是否在Modal Dialog中,不過忘了一點---呼叫端與Modal Dialog網頁跨網域時,會因IE的安全限制禁止Modal Dialog存取呼叫端的window object,此時window.dialogArguments==undefined。這解釋了在正式環境裡,由於呼叫端與Modal Dialog分處不同的機器,造成window.dialogArguments判斷失效,連帶導致沒加<base target>,最後的下場就是Submit時另開新視窗...

解決方法? 很簡單,用if (window.dialogWidth)取代if (window.dialogArguments)就可搞定。收工!!


Comments

# by Ian

hi Jeffrey; 跟您請教一下 使用window.showModalDialog方式 也把<base target="_self">設定進去 但是用button註冊一個onclick=window.loacation方式 導向別頁,依然會開起另一個視窗 但若是單純的<a href>則ok 不知道這是什麼原因呢? 我的aspx是有用MasterPage的,會有關係嗎?

Post a comment