无论你是否认为弹出窗口是的一种现代形式的鼠疫,就如同蝗虫和布兰妮的CD一样,实事是,它们作恶已经有一段时间了。许多基于网络的应用都使用弹出窗口做一些无用的事情,从显示帮助页面到显示各种不同商品图片不等。不幸的是,如果客户端的浏览器安装了阻止弹出窗口的插件,并且激活了,那么,对于商家来说,对它们使用弹出窗口就是在做无用功。
一种可行的解决方案就是在你的网站到处都写满“此网站使用了弹出窗口,请确保您没有使用弹出窗口阻拦功能”的消息。但是这样做,希望让用户在浏览你的网页的时候不使用弹出窗口的功能似乎不太现实。你需要做的就是检测用户是否使用了阻拦弹出窗口的功能,使你的网站适应浏览需求。
使用一个弹出窗口来阻止弹出窗口
我所选择完成这个功能的办法就是试图去打开一个弹出窗口。当然,这就意味着在我编程过程中必须非常的小心,因为如果我不这么做,在客户端中也许就会出现错误。保持着这种心态,我安装了Google Toolbar ,并且使用一个装载事件处理器(onload event handler)来对页面进行编码,这个装载事件处理器可以检测到阻止弹出窗口的软件。这样做的结果如Listing A和Listing B所示。
在Listing A中显示的方法是那个装载事件处理器(叫做setEvents)被击中,它试图打开一个在Listing B中显示的popupChild.html页面。这样看起来这种办法足够可以确定阻止弹出窗口的功能是否在运作,但是事情不总是这样。这依赖于这个拦截功能安装的没有问题。我们需要的就是使子窗口弹出来显示“Hello,world!”或者什么其它的东西。这个页面使用了setTimeout方法来延时调用checkChild方法;这就给弹出窗口留出了改变父窗口的一个隐藏的输入对象并且关闭它自己所需要的时间。一旦这个工作完成,checkChild方法就会检查隐藏输入对象,确认子窗口是否改变了它的内容。如果它的内容已经被改动过了,那么弹出窗口功能就会生效,这就意味着客户没有使用拦截功能。
在整个测试过程中,有两个最难的部分,就是访问父窗口的隐藏输入对象和估计弹出窗口打开的时间。第一个问题通过使用文档对象模型的window.opener就很容易解决了。第二个部分就更困难一些,毕竟在我使用这些例子的时候,浏览器和服务器都在同一台机器上。所以,即使这些例子在我这里运行正常,可是,它们对于其他人也许就不适用了。必须还要找到一条更好的办法。
一个更好的办法
对于JavaScript而言,有一件有趣的事情,就是它不受浏览器影响,它是相对一致的。如果一个状况在一个浏览器上出现了,奇怪的是,在其它浏览器上出现这个状况的可能性会很小。例如,使用对象编写警告代码,在微软的Internet Explorer 中会显示“[object]”而在Mozilla中会显示“[object Window]”。另外一个有意思的事情就是上述的问题只会在对象创建了以后才发生。大家可以参见Listing C的例子。我们需要注意上述的问题,因为我们仅仅是检查是否打开了阻止弹出窗口的功能,它仅仅是一个空页面。
我之所以编写这段代码,是因为最近有一些开发者和技术支持人员花费了三个小时,在会议室中解决这个问题。远端客户坚持说它们没有使用弹出窗口的拦截功能;直到大家都精疲力尽的时候才有人提出要检查一下客户安装的软件。在接近列表的最末端有一个给客户电子邮件添加可爱的笑脸的程序。只通过简单的检查就发现,这个程序不仅仅有给电子邮件添加笑脸的功能,它同时还可以拦截弹出窗口。用户安装了这个东西,却丝毫没有察觉,这就是我编写代码所希望避免的问题。
|