使用unknown类型判断当前窗口类型
时间:2006-02-25 来源:f980215
使用unknown类型判断当前窗口类型
使用Form认证,当认证超时后会自动跳转到我们定义的login页面,并且在重新登陆后我们可以返回原超时页面。在一般的情况下,这也算是一种比较不错的用户的体验了,不过Form认证的这种自动处理机制有时也会给我们带来麻烦。就是当我们在系统中使用Modal Dialog后,问题就来了。
如果我的页面A是一个普通的页面,在其上可以通过按钮或链接开启Modal Dialog B页面。这时候如果Form认证的登陆已超时,我们点击A页面启动B。Form认证自动定向的login页面就跑到Modal Dialog B里面去了,就在Modal Dialog里面登陆呗,新的问题又来了,重定向回A页面的时候,IE又开启新的窗口了。在login页面中加上,这下好了,新的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版本号。
Test.htm
html>
body>
button onclick="hehe()">
clickbutton>
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>
a href="pop.htm" target="_blank">popa>
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>
还不如判断 typeof window.dialogWidth 呢, 如果是 string 就判断是 dialog。(未经详测, 且依赖于你没有在普通窗口里设一个同名的属性)
http://birdshome.cnblogs.com/archive/2005/08/24/221398.html
相关阅读 更多 +