`
lumingming1987
  • 浏览: 116648 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

判断当前窗口类型

 
阅读更多

var type = typeof(window.dialogArguments);

var openerType = typeof(window.opener);

if(openerType != 'undefined') {

    //window.open窗口

    //alert("nomal window");

} else (type != 'undefined') {

    //模态窗口

    //alert("modal window");

}

 

 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版本号。

分享到:
评论

相关推荐

    易语言HOOK判断激活窗口源码

    在描述中提到的"判断激活窗口"是指获取当前用户正在交互的窗口。这在许多应用场景中都非常有用,比如制作桌面辅助工具、系统监控软件等。通过HOOK,我们可以实时知道哪个窗口获得了焦点,从而执行相应的操作。 源码...

    易语言判断窗口全屏

    1. 获取当前窗口的大小和位置,使用 `取窗口左上角X_` 和 `取窗口左上角Y_` 函数获取窗口的左上角坐标,`取窗口宽度_` 和 `取窗口高度_` 获取窗口尺寸。 2. 使用 `取屏幕高度_` 和 `取屏幕宽度_` 获取屏幕的分辨率。...

    易语言源码易语言HOOK判断激活窗口源码.rar

    2. 设置全局变量:可能需要存储一些状态信息,比如当前激活的窗口句柄。 3. 注册钩子:使用`系统消息挂钩`命令注册钩子,传入钩子类型(如WH_GETMESSAGE)、钩子函数地址、以及钩子的范围(如全局或线程内)。 4. ...

    同步所有数据窗口中字段长度

    2. **获取数据窗口列表**:在PB环境中,你可以通过“项目浏览器”(Project Explorer)查看当前项目中的所有数据窗口对象。这些数据窗口可能分布在不同的PBL(PowerBuilder Library)文件中,例如“pb8_csdn.pbl”。...

    delphi中判断子窗体是否打开

    `is`关键字用来检查当前子窗体的类型是否为`Tf_Pass`。如果找到匹配的子窗体,就调用`BringToFront`方法使其位于所有其他子窗体之上,并通过`SetFocus`方法使该子窗体获得输入焦点。 此外,关于在窗口菜单下显示已...

    Symbian如何判断当前处于主界面.zip

    要判断当前是否处于主界面,我们需要关注的是当前活动的UI窗口。Symbian中的应用程序框架(Application Framework)维护了一个活动栈,其中包含所有已打开的活动窗口。栈顶的窗口即为当前活动窗口。主界面通常是一个...

    易语言判断OS版本类型

    4. 判断操作系统的版本类型:根据`OSVERSIONINFO`中的`dwMajorVersion`(主版本号)和`dwMinorVersion`(次版本号),结合`wProductType`(产品类型)字段,可以编写条件语句来判断OS的版本类型。 例如,以下易语言...

    一个可以知道鼠标位置窗口的窗口的句柄(HWND),窗口类名(包括每一个子窗口)的代码

    在Windows操作系统中,窗口句柄是标识窗口的重要信息,窗口类名则用于区分不同类型的窗口,而窗口标题提供了用户交互时的标识。这些信息在进行系统级编程、自动化测试或用户界面监控时非常关键。 首先,我们需要...

    一个简单的小程序识别文件真实类型

    文件的文件头是不会被更改的,我们可以通过对文件头的读取来判断当前文件的类型。压缩包里的JSON文件包含了我新增的一些特殊文件类型,打开方式在cmd窗口输入“py-checkfiletype-master”回车,拖入待测文件/文件夹...

    js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口

    本文介绍了如何使用JavaScript来判断浏览器类型、处理全角与半角空格以及自动关闭当前窗口。这些技巧对于提高Web应用的用户体验非常有帮助。开发者可以根据自己的具体需求进行适当的调整和扩展。

    vc++ 枚举出桌面上所有的窗口_真棒!

    这可以通过`GetClassName`函数实现,它返回窗口的类名字符串,这对于识别特定类型的窗口(如浏览器窗口、文本编辑器窗口等)非常有用。 此外,`FindWindow`函数可以用于查找具有特定标题或类名的窗口,而`...

    易语言取外部程序指定窗口位置

    解析返回的`WINDOWPLACEMENT`结构体,就可以判断窗口当前的状态。 易语言提供了丰富的API支持,使得开发者可以轻松地实现这些功能,尽管它的语法可能与C++或Java等主流语言有所不同,但其简洁的表达方式使得学习和...

    窗口信息查看工具可以查看窗口句柄等

    窗口的类名则代表了该窗口的控件类型,它们定义了窗口应该如何表现。不同的类名对应不同的窗口功能和样式,如常见的类名有按钮(button)、文本框(text box)、列表框(list box)等。通过类名,开发者可以轻松识别出窗口...

    易语言窗口贴边隐藏

    3. **判断窗口位置**:根据新位置信息,判断窗口是否与屏幕边缘重合。例如,如果窗口的左边或上边距离屏幕的左边或上边的距离小于一定的阈值,我们可以认为窗口已经贴到了屏幕边缘。 4. **执行隐藏或最小化操作**:...

    win32创建能拖动的窗口

    当用户在窗口上按下鼠标并移动时,系统会发送WM_NCHITTEST消息,询问当前位置的鼠标点击类型。如果返回值是HTCAPTION,表示鼠标在标题栏上,那么窗口就可以被拖动。 ```cpp LRESULT CALLBACK WndProc(HWND hWnd, ...

    易语言取前台窗口子控件

    类名在编程中常用于判断控件类型,执行相应的操作。 6. **取句柄取标题**:获取子控件的标题或文本,这通常是用户看到的控件上的文字,如按钮上显示的“确定”、“取消”等。 7. **取句柄取矩形**:句柄取矩形是指...

    遍历窗口控件判断内容被改变

    当我们谈论“遍历窗口控件判断内容被改变”这个主题时,实际上是在探讨如何在程序运行时监测并响应用户对界面控件(如按钮、文本框、列表框等)的修改。这通常涉及到Windows API的使用,事件处理机制以及可能的数据...

    javascript判断页面是否是刷新还是关闭

    1. `beforeunload` 事件:当用户尝试离开当前页面时(如点击刷新按钮、关闭窗口或导航到另一个URL),浏览器会先触发`beforeunload`事件。这是一个预卸载事件,允许开发者进行确认操作,比如询问用户是否确定要离开...

    遍历子窗口函数 得到控件句柄、CEdit CListView CComboBox

    - 如果需要查找多个类型的控件(如`CEdit`、`CListView`、`CComboBox`),可以考虑扩展此函数,增加更多条件判断。 - 需要注意的是,在多线程环境中,如果存在其他线程同时修改窗口结构,可能会导致遍历不完整或错误...

Global site tag (gtag.js) - Google Analytics