检测用户是否已经设置了拦截弹出窗口功能

ZDNet软件频道 时间:2004-11-18 作者:Builder.com |  我要评论()
本文关键词:
弹出窗口没必要有罪恶感,它本身是一种很有用的Web工具,但是你怎样才能知道你的用户是否已经拦截了它们呢?
本文译自Builder.com,未经许可请勿转载

弹出窗口没必要有罪恶感,它本身是一种很有用的Web工具,但是你怎样才能知道你的用户是否已经拦截了它们呢?

不管你是否将弹出窗口看成一种瘟疫的现代版,就像蝗虫和Britney Spears CDs,有些时候人们确实将它们看成一个恶魔,却又离不开它。许多基于Web的应用软件用弹出窗口来完成大量一般性的任务,包括从显示帮助页面,到显示可供利用的产品的不同图象。不幸的是,如果该客户的浏览器中安装了一个弹出窗口拦截并将它激活了,那么,使用弹出窗口对你来说就不是那么好玩的一件事了。

一种可能的解决方法是,在你的站点上到处散布信息,你可以这样说:“这个站点使用弹出窗口。请确保你的弹出窗口拦截功能已被设置为无效。”不过,为了使用你的站点,就让你的用户将弹出窗口拦截功能设置为无效,对于用户来说,似乎不那么友好。我们需要的不是这个,我们要找到一种方法,能检测出一个用户是否具有弹出窗口拦截功能,这样一来,你的站点就可以按照检测出的信息作出适当的反应。

弹出窗口来销毁它自己

为了完成这一任务,我选择了下面这一方法,即试着打开一个弹出窗口。当然,这就意味着,在我的程序中必须有良好的防卫措施,这是因为,假如防卫不当的话,就存在这样一种可能,即客户可能会看到一个出错信息。由于了解这些,我就安装了Google Toolbar,并用装载事件处理器来给页面编码,这种处理器可以检测弹出窗口模块化软件。这种努力所得到的结果如图表A图表B所示。

图表A中的页面显示的装载事件处理器’setEvents被激活了,它试图打开popupChild.html这一页面,如图表B所示。尽管看起来好像单凭一个诱使人出错的陷阱就足以让用户弄清他的弹出窗口是否运行了,但是事实有时却不是这样。尽管有时依赖于所安装的弹出窗口拦截是正确的,然而有时却会出错。从根本上讲,我们所需要的是,让子窗口站出来,冲大家喊:“hello,全世界人民!”或者其它一些跟这相类似的都可以。这样一来,该页面就会使用setTimeout这一方法来推迟调用函数checkChild;这就给予了弹出窗口足够的时间,让它可以在母窗口改变一个隐藏输入对象,并可以关闭它自身。当这些都完成以后,checkChild会检测该隐藏输入对象的值,以此测定该子窗口在内容方面是否得以改进。如果内容改变了,就表明弹出窗口运行了,这就意味着没有安装弹出窗口拦截软件。

整个测试过程中难度最大的两个部份,一个是从母窗口访问该隐藏输入对象,另一个是估计打开弹出窗口所需要的时间。只要正确使用Document Object Model的Window.opener,就可以很轻易地解决第一个问题了。而第二个问题就难得多了;这是由于,当我演示这些例子的时候,浏览器与服务器是在同一台机器上。因此,尽管这些例子对我来说行得通,却并不能保证它在任何地方对任何人都是这样的。我们应该研究出更好的方法来。

一个更好的方法

关于JavaScript,有这样一件有趣的事,那就是,不管用的什么样的浏览器,它都与之兼容。如果一个程序能在某个浏览器上运行,那么只需要对它作一点小小的变动,就能让它在另一个浏览器上运行了。例如,用一个对象来编译一个警报,在Microsoft Internet Explorer中会显示“[对象]”,在Mozilla中会显示“[对象窗口]”。还有一件很有趣的事,就是上述情况只在该对象已经被创造出来的条件下才会发生。系列对它的论证的最终的结果显示在图表C中。之所以我们要记录这些,是因为我们只需要进行检测以确定能不能打得开某个弹出窗口,那只不过一个空白页面。

 

我开发出这一编码有许多原因,其中之一就是,最近,有几个开发者和技术支持人员在一个会议室里呆了三个小时之久,就是为了讨论这一问题,而且是针对我们的按顺序登录系统。一个远程客户一再坚持,说他们没有弹出窗口拦截装置;在想尽所有可能由我们而引起的问题之后,才有人想到去检查一下该客户安装了哪些程序。在那张清单的接近尾部的地方,有一个程序,它在客户的Email中添加了一些可爱的笑脸图像。在做了为数不多的一些调查研究之后,他们确定了不仅在email中添加一些笑脸图像,而且在其它的对象中,它也防碍弹出窗口的运行。该用户已经安装了一个弹出窗口拦截装置,他自己却不知道,我就是想用我的这个编码来避免这一情况的发生。



责任编辑:李宁

欢迎评论投稿

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134