使用unknown类型判断当前窗口类型

    ASP.NET给我提供了多种页面认证模式,由于集成认证对于客户端的部署有较高的要求,在很多情况下我们可能不能良好部署。而Passport认证模式,对于企业应用我真不知道有没有使用的,要你把安全寄托于第三方,会是什么感觉呢?所以Form认证就算是相对有用的一种认证解决方案了。

    使用Form认证,当认证超时后会自动跳转到我们定义的login页面,并且在重新登陆后我们可以返回原超时页面。在一般的情况下,这也算是一种比较不错的用户的体验了,不过Form认证的这种自动处理机制有时也会给我们带来麻烦。就是当我们在系统中使用Modal Dialog后,问题就来了。

    如果我的页面A是一个普通的页面,在其上可以通过按钮或链接开启Modal Dialog B页面。这时候如果Form认证的登陆已超时,我们点击A页面启动B。郁闷的问题就来了,Form认证自动定向的login页面就跑到Modal Dialog B里面去了。管它的呢,就在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

    最后终于柳暗花明又一村了,有这个Modal Dialog中的unknown类型和普通IE窗口中的undefined类型,我们就可以不强制传递和依赖任何参数标识,而确切的知道目前页面所在的窗口的类型,是普通的IE窗口还是模态(Modal或Modaless)窗口了~~

    检测代码如下(不过不能区分Modal和Modaless):
<script language="javascript">
var type = typeof(window.dialogArguments);
var openerType = typeof(window.opener);
if ( type != 'undefined' && openerType == 'undefined' )
{
    alert('The page is loaded 
in a Modal or Modaless window.');
}

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

</script>

    这个检测在IE 6.0 sp2中通过,但不知道这个unknown类型是什么时候引入到脚本对象中的。如果你有兴趣并使用IE 6.0以下版本,希望您能测试一下本方法并告知测试结果和IE版本号。

posted on 2005-08-24 00:18  birdshome  阅读(...)  评论(...编辑  收藏

导航