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

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

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

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

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

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

InBlock.gif
else
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif {
InBlock.gif    alert('The page is loaded 
in  a normal IE window.');
ExpandedBlockEnd.gif}

None.gif
</ script >

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


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
|
5月前
|
JSON 小程序 JavaScript
小程序根据返回值是否为空判断标签是否显示
小程序根据返回值是否为空判断标签是否显示
37 0
|
5月前
|
存储 JavaScript 前端开发
【JS交互埋坑】事件函数自动将数字字符串String转为数值Number
【JS交互埋坑】事件函数自动将数字字符串String转为数值Number
36 0
|
8月前
|
前端开发
根据数组code值返回value值
根据数组code值返回value值
43 0
pywintypes.com_error: (-2147221005, ‘无效的类字符串‘, None, None)
pywintypes.com_error: (-2147221005, ‘无效的类字符串‘, None, None)
1181 0
pywintypes.com_error: (-2147221005, ‘无效的类字符串‘, None, None)
判断Object中数据类型(已知类型、未知类型))
判断Object中数据类型(已知类型、未知类型))
108 0
|
C++
使用C++模板判断两个类型是否一样
使用C++模板判断两个类型是否一样
100 0
成功解决pywintypes.com_error: (-2147221005, '无效的类字符串', None, None)
成功解决pywintypes.com_error: (-2147221005, '无效的类字符串', None, None)
成功解决pywintypes.com_error: (-2147221005, '无效的类字符串', None, None)
声明了Integer类型的两个数值并且值相等,但为什么返回了false?
声明了Integer类型的两个数值并且值相等,但为什么返回了false?
159 0

热门文章

最新文章