天天看點

使用unknown類型判斷目前視窗類型

  ASP.NET給我提供了多種頁面認證模式,由于內建認證對于用戶端的部署有較高的要求,在很多情況下我們可能不能良好部署。而Passport認證模式,對于企業應用我真不知道有沒有使用的,要你把安全寄托于第三方,會是什麼感覺呢?是以Form認證就算是相對有用的一種認證解決方案了。

使用Form認證,當認證逾時後會自動跳轉到我們定義的login頁面,并且在重新登陸後我們可以傳回原逾時頁面。在一般的情況下,這也算是一種比較不錯的使用者的體驗了,不過Form認證的這種自動處理機制有時也會給我們帶來麻煩。就是當我們在系統中使用Modal

Dialog後,問題就來了。

    如果我的頁面A是一個普通的頁面,在其上可以通過按鈕或連結開啟Modal Dialog

B頁面。這時候如果Form認證的登陸已逾時,我們點選A頁面啟動B。郁悶的問題就來了,Form認證自動定向的login頁面就跑到Modal Dialog

B裡面去了

使用unknown類型判斷目前視窗類型

。管它的呢,就在Modal

Dialog裡面登陸呗,新的問題又來了,重定向回A頁面的時候,IE又開啟新的視窗了,真是亂七八糟。在login頁面中加上<base

target=_seft>,這下好了,新的IE視窗不出來了,重定向回去的A頁面就呆在Modal Dialog裡面了,再次暈。

如果我們能在login頁面判斷但前的視窗類型,我們就能給使用者一個友好的提示,告訴使用者本次登入已逾時,并要求使用者登陸login頁面進行再次登入就行了。那麼我們能判斷出頁面所處的視窗的類型嗎?這個确實是一個挺無理的要求,因為不管window對象的方法:open、showModalDialog和showModelessDialog所開啟的新視窗都是一個完備的Window的對象執行個體。window對象該有的屬性,它們都一個不撂下統統具有。仔細研究,這幾個方法還是會影響window對象的屬性,其中open比較好判斷的一個,因為使用open開啟的視窗,新視窗的window.opener會指向它的父視窗。而showModalDialg和showModelessDialog開啟的新視窗的window.opener總是undefined。但是對于正常的follow

link,新頁面的window.opener也同樣是undefined。如果點選連結新開起IE視窗(不管是shift+click,還是target=_blank),其新視窗的window.opener和window.open後一樣,是指向其父視窗。

似乎已經山重水複疑無路了,不過還好想起showModalDialog和showModalessDialog後我們常常會使用到的window屬性dialogArguments,看看它是什麼值呢?當然如果我們在使用showXxx時給第二個參數指派,那麼新視窗中的window.dialogArguments就是這個所賦予的值了。似乎可以使用這個參數的有無來判斷我們啟動的視窗是不是Modal

Dialog,不過這個方法太依賴于具體的實作,就是不管什麼情況必須給Modal

Dialog傳參數,感覺風險挺大的。如果我們不給showXxx的第二個參數指派,那麼會是什麼情況呢?首先想到八成是undefined或者null了。可是當我們在Modal

Dialog裡面執行typeof(window.dialogArguments)後,我們意外的發現,結果是:unknown類型!于是馬上看open方法開啟的新視窗,執行typeof(window.dialogArguments)的結果卻是:undefined

使用unknown類型判斷目前視窗類型

    最後終于柳暗花明又一村了,有這個Modal

Dialog中的unknown類型和普通IE視窗中的undefined類型,我們就可以不強制傳遞和依賴任何參數辨別,而确切的知道目前頁面所在的視窗的類型,是普通的IE視窗還是模态(Modal或Modaless)視窗了~~

檢測代碼如下(不過不能區分Modal和Modaless):

使用unknown類型判斷目前視窗類型
使用unknown類型判斷目前視窗類型

<script language="javascript">

使用unknown類型判斷目前視窗類型
使用unknown類型判斷目前視窗類型

var type = typeof(window.dialogArguments);

使用unknown類型判斷目前視窗類型

var openerType = typeof(window.opener);

使用unknown類型判斷目前視窗類型

if ( type != 'undefined' && openerType == 'undefined' )

使用unknown類型判斷目前視窗類型
使用unknown類型判斷目前視窗類型
使用unknown類型判斷目前視窗類型

{

使用unknown類型判斷目前視窗類型

    alert('The page is loaded in a Modal or Modaless window.');

使用unknown類型判斷目前視窗類型

}

使用unknown類型判斷目前視窗類型

else

使用unknown類型判斷目前視窗類型
使用unknown類型判斷目前視窗類型
使用unknown類型判斷目前視窗類型
使用unknown類型判斷目前視窗類型

    alert('The page is loaded in a normal IE window.');

使用unknown類型判斷目前視窗類型
使用unknown類型判斷目前視窗類型

</script>

    這個檢測在IE 6.0

sp2中通過,但不知道這個unknown類型是什麼時候引入到腳本對象中的。如果你有興趣并使用IE

6.0以下版本,希望您能測試一下本方法并告知測試結果和IE版本号。

本文轉自部落格園鳥食軒的部落格,原文連結:http://www.cnblogs.com/birdshome/,如需轉載請自行聯系原部落客。

繼續閱讀