您是否注意到一些网站曾强行闯入您的视线?是的,本文要讨论的就是这类站点。当您在页面之间导航时,这类站点会悄悄打开其它浏览器窗口。通常情况下,这些意外的窗口仅显示一些在线广告之类的无用内容。这些窗口通常称为弹出式窗口,一般是通过页面的脚本调用 window.
open 方法来实现。(有关详细信息,请参见
open 方法(英文)。)尽管 window.
open 方法有时会给人带来一些烦恼,但是如果使用得当,完全可以通过该方法构建功能强大的应用程序。
Internet Explorer 开发小组经常收到有关希望禁止弹出式窗口出现的用户请求。这使他们面临两难的选择:是允许开发人员自由使用这一孕育巨大潜能的工具为客户提供完美的解决方案,还是应该对平台进行限制以使开发人员不致于滥用这一功能?Internet Explorer 小组的最终意见是:除了导致安全隐患的情况之外,应尽可能允许开发人员灵活使用这一工具来构建功能强大的应用程序,而不要强加一些不适当的限制。
下面我想说明一下为什么弹出式窗口功能是必不可少的,还将就站点如何留住访问者(或至少消除他们的不满情绪)提出一些建议。
必不可少的弹出功能
显示其它窗口的功能非常有用,它能使用户在保留上下文的情况下查看相关的内容,这一功能在 Web 的很多地方都得到了利用。用户通常很难意识到自己使用了另一个窗口,他们在执行任务的过程中非常自然地就打开了这个窗口。
MSDN 使用 Internet Explorer 提供的在线参考资料就是成功使用 window.open 功能的一个示例。在浏览器中打开 onblur 事件(英文)网页。如果向下滚动,将会看到一段示例代码和"Show Me"按钮,单击此按钮就可以看到示例代码的效果。单击此按钮后,示例代码的运行结果将显示在一个单独的新窗口中。在这种情况下,弹出功能是必不可少的,因为它为用户保留了上下文,使用户能同时查看示例和引用的页面。
如果浏览器限制 window.open 功能,当前 Web 上的很多站点就无法正常工作。尽管我们不关心那些仅仅创建弹出式广告的站点是否崩溃,但是很多合理使用这一功能的站点也会遭殃。
使用不当的情况
我们来看一下滥用这一功能的情况,我故意提到了"淫秽"一词,因为滥用这一功能通常都与淫秽站点有关。我将以下现象称为"俘获用户":每当您单击到另一页面的链接时,或尝试关闭浏览器窗口时,该页面的一些脚本将俘获这一事件,然后强行打开另一个浏览器窗口。似乎色情站点使用这一技术的频率最高。
这种情况最令人恼火。特别是当您在 Web 上无意之中进行了一次搜索,意外地闯入这类站点时更是如此。设想一下突然发现自己不知不觉打开了五个或六个窗口,每个窗口充斥着淫秽的图像时,您有什么样的感受;更糟的是,当您试图关闭其中一个窗口时,反而弹出了另外两个类似的窗口!这不仅令人恼火,简直是对人的无理侵犯。无辜的用户要想逃离这源源不断的图像流,唯一的方法就是使用计算机上的"重置"按钮。
这类站点之所以这样做,无非是为了引诱用户去浏览从而增加广告收入,因此它们不大可能听取我提出的有关如何合理使用弹出功能的建议。尽管如此,我还是要呼吁这类站点不要玩俘获用户的把戏,重新为自己的内容确定等级(请参见为 Internet 内容划分等级(英文)),以使用户能正确设置浏览器,避开这类站点。
合理使用的情况
以下我总结了合理使用这一技术应注意的几个问题。如何使用这一功能,最后的决定权在您。但是请记住,如果滥用了这一技术,就会激怒访问您站点的用户,他们很可能就再也不会访问它了。
- 仔细考虑站点面向的用户群。他们是否真正理解多个窗口的概念?
本专栏的读者当然了解如何同时运行多个应用程序以及如何在它们之间切换。但是,也要考虑缺乏经验的计算机用户的处境,对他们来说,管理多个窗口可能是一项艰巨的任务。如果希望毫无经验的用户经常访问您的站点,那么在单个窗口中提供站点的整个用户界面可能更合适,这样用户就不会丢失上下文,也不会对窗口切换感到无所适从。
- 直接响应用户操作时只打开一个新窗口,并考虑如何使用户明确这一点,即他们的操作将打开一个独立窗口。
在我看来,最令人恼火的事之一就是:计算机程序在用户没有执行任何操作的情况下就打开一个新窗口。如果您使用 window.open 只是为了直接响应用户操作,则用户就会将该操作与结果联系起来。如果在用户操作与结果之间存在较长的延迟时间,则用户很难会想到这两者之间存在的联系。
- 如果只是为了显示一个广告,请不要使用弹出功能。
如果广告不是用户访问的主站点的一部分,将不可能真正引起用户的关注。
- 不要在您的站点上玩俘获用户的把戏。
当用户离开您的站点时应及时提示用户,询问他们是否希望保存特定状态。用打开另一个窗口来俘获用户是十分无礼的,很难吸引用户再次光临您的站点。
使用动态 HTML 代替弹出式窗口
动态 HTML 的功能非常强大,可以构建出灵活的应用程序。几年以前,整个 Web 都是静态的;每当用户单击某个链接时,服务器都会给他发送全新的页面。随着 Java、插件和 ActiveX 控件的引入,大大提高了用户交互性,但是它们不能与页面的 HTML 内容很好地集成。Microsoft 在 Internet Explorer 4.0 中首次加入动态内容支持功能,这一功能在 5.0、5.5 中不断得到加强。在现在的 6.0 预发布版中,提供了一系列更加丰富的功能。
有了这些功能后,就可以将所有用户界面纳入一个浏览器窗口中,使用户感到自己正在运行一个完整的应用程序。这里举出一个我喜爱的示例,blox.com(英文)。这个公司提供一个在线电子表格和演示软件,该软件在 Internet Explorer 浏览器中运行,不需要安装任何其它组件。该解决方案仅限于使用 Internet Explorer 来访问此站点和运行应用程序。尽管如此,它还是表明借助动态 HTML 完全可以获得丰富的 Web 体验,而不必使用给人带来烦恼的附加窗口。
有一种技术可以将独立内容作为页面的一部分来提供,这就是"内部帧",即通常所说的 IFrame(由于使用了 <IFRAME>
标记)。IFrame 使得独立的 HTML 文档可显示为父文档的一部分。(请参见 IFRAME 元素 | iframe 对象(英文)。)
现在 Netscape 6 已支持该功能,而 Internet Explorer 从版本 3 开始就支持该功能了,因此这一技术在 Web 上的应用将会越来越广泛。使用这一方法后,就能避免与帧集有关的开销和布局限制,更有效地管理站点上的内容。
要避免使用多个浏览器窗口,也可以在用户的浏览器窗口上下文中使用 HTML 对话框与用户交互。请参见"好的对话框的重要性"(英文)一文,这篇文章是我去年写的,其中涉及到这方面的内容。
最后提示
由于本专栏是围绕新窗口展开论述的,因此在本文即将结束之际,我想提醒 Internet Explorer 超级用户对可能被忽略的一个问题加以注意。当您单击以电子邮件方式发送给您的超级链接时,可能会发现引用的页面显示在已打开的浏览器窗口中。这种行为的原因只是为了最有效地使用您计算机的资源。尽管如此,我们也认识到对于超级用户来说,可能并不希望这样做。因此,您可以选择是否希望总打开新的浏览器窗口。
要做到这点,请转到"工具"菜单,选择"Internet 选项..."对话框。在"高级"选项卡下,确保"重新使用启动快捷方式的窗口"选项不被选中。由于我经常要打开多个浏览器窗口并链接到以电子邮件发送给我的超级链接,因此我没有选中该选项。这样我可以对打开的所有浏览器窗口进行更精确的控制。
David Massy 偶尔会戴上太阳镜扮酷,不过摘下墨镜的他是 Windows 和 Internet Explorer 技术的宣传人,也就是说,他负责向 Microsoft 的客户们介绍如何能够将各种技术发挥至极致。在成为技术宣传人之前,Dave 是 Internet Explorer 小组的项目经理。因为 Dave 来自英国,他总是在不懈地教导美国同事们如何正确地读"tomato"这个词。