鸟食轩

 Microsoft .NET[C#] MVP 2003
随笔 - 424, 文章 - 231, 评论 - 5407, 引用 - 344
数据加载中……

使用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 阅读(3802) 评论(4)  编辑 收藏 所属分类: Jscript&Dhtml开发

评论

#1楼 [楼主]   回复  引用  查看    

Test.htm
<html>
<body>
    
<button onclick="hehe()">
        click
</button>

    
<script language="javascript">
function hehe()
{
    window.showModalDialog('pop.htm');
    window.showModalDialog('pop.htm', 'abc', '');
    window.open('pop.htm');
    window.showModelessDialog('pop.htm');
    window.showModelessDialog('pop.htm', 
new Object(), '');
}

</script>

    
<href="pop.htm" target="_blank">pop</a>
</body>
</html>

pop.htm
<html>
<body>
    
<script language="javascript">
var count=0;
for ( var key in window )
{
    document.write('window.' 
+ key + ' = ' + typeof(window[key]) + '<br>');
    count
++;
}

document.write(count 
+ '<hr>');
document.write('window.opener 
= ' + typeof(window.opener) + '<br>');
document.write('window.dialogArguments 
= ' + typeof(window.dialogArguments) + '<br>');
document.write('window.abc 
= ' + typeof(window.abc));
</script>
    
<script language="javascript">
var type = typeof(window.dialogArguments);
if ( type != 'undefined' )
{
    alert('The page is loaded 
in a Modal or Modaless window.');
}

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

</script>
</body>
</html>
2005-08-24 10:16 | birdshome      

#2楼    回复  引用    

在windows 2003, IE6.0 sp1下没有问题。
2005-08-24 12:46 | alada [未注册用户]

#3楼    回复  引用    

看起来你这个办法还是不得不依赖传递的参数, 你依赖的是不传递类型为 undefined 的参数。
unknown 类型伴随着 ActiveXObject() 出现,其返回值就是此类型。
还不如判断 typeof window.dialogWidth 呢, 如果是 string 就判断是 dialog。(未经详测, 且依赖于你没有在普通窗口里设一个同名的属性)
2005-08-25 11:00 | modico [未注册用户]

#4楼    回复  引用    

very very good ! thank you!!!!!
2005-09-21 17:29 | tigerjacky [未注册用户]

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-08-24 01:24 编辑过
成果网帮您增加网站收入


相关链接: