Summary

网页脚本要开新窗口,只需发出调用。人是否邀请过它,曾经是另一回事。Mozilla 的旧新闻档案在 2003 年 3 月已提到弹窗拦截,6 月发布 Mozilla 1.4 时又写到这项功能的改进。浏览器开始替读者守门:网页送来的开门请求,需要先过一道由浏览器掌握的关。

Microsoft 为 Windows XP Service Pack 2 编写的 IE6 部署指南把内置弹窗拦截器列为 Internet Explorer 的新功能,也介绍承接拦截消息的信息栏。Microsoft 于 2004 年 8 月 6 日宣布 SP2 交付制造商。产品随后分批进入用户电脑;有意思的设计已经写在指南里:浏览器开始追踪用户动作的来路。

Microsoft 对 IE6 SP2 的技术解释说,浏览器会判断弹窗出现前用户是否点击了链接或页面元素。跟在点击后面的窗口,与脚本自行推出的窗口得到不同待遇。被挡下的窗口会进入信息栏,用户仍可手动打开。浏览器查的是读者刚才是否真的点了这一下。

如今 Mozilla 的 window.open() 文档把规矩说得更细:弹窗应直接回应用户输入,每次调用都需要独立的手势;被拦截时可能返回 null。网页可以据此设计备用流程。按钮和代码仍归网页编写,但是否有多出来的窗口,已经不由它单方面拍板。

HTML 现行标准的用户激活机制又给这张请柬加上有效期。有些操作会消耗短暂的激活状态,下一次调用要等下一次真人操作。标准还考虑嵌套框架,防止一记点击被层层转手、反复花掉。一次点击只给刚发生的动作签发短期请柬。

弹窗拦截改变了网页的礼数。一个真正由按钮邀请的附加窗口仍有位置;脚本自己带来的一队窗口得在门口排队。window.open() 仍是网页的请求,浏览器补上了最后一句:谁敲的门?