TIPS-About Modal Dialog Detection

這陣子一直被一個問題所苦,有個放在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)就可搞定。收工!!

歡迎推文分享:
Published 25 July 2007 02:00 AM 由 Jeffrey
Filed under: , ,
Views: 10,618



意見

# Ian said on 09 July, 2009 10:25 PM

hi Jeffrey;

跟您請教一下

使用window.showModalDialog方式

也把<base target="_self">設定進去

但是用button註冊一個onclick=window.loacation方式

導向別頁,依然會開起另一個視窗

但若是單純的<a href>則ok

不知道這是什麼原因呢?

我的aspx是有用MasterPage的,會有關係嗎?

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<July 2007>
SunMonTueWedThuFriSat
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication