如果我使用 jquery 发起点击window.open()
,它会被弹出阻止程序阻止,如果我手动点击,则窗口不会被阻止。两者的浏览器有何不同?
3 回答
在这个 bug上详细讨论了 Firefox 的实现,并且这个另一个 bug有一些更有趣的背景,包括站点将经历多长时间才能向毫无戒心的用户强加一个不需要的弹出窗口(在这种情况下:window.open()
从图像load
事件)。如果您在 Bugzilla 周围搜索,您会发现 Mozilla 人员花了很多年才让这一切正常工作,例如这里有一个 2001 的错误。
window.open()
它目前的工作方式是这样的:当 Firefox 收到来自操作系统的点击事件时,在 JavaScript 中启用一定的时间(在dom.disable_open_click_delay
中查找about:config
)。如果您在click()
没有用户点击的情况下从代码中调用事件,那么第一步,window.open()
永远不会发生启用,尽管调用window.open()
本身会成功阻止站点检测到您启用了弹出窗口阻止。
我不确定其他浏览器是如何实现这些东西的,但如果它有很大的不同,我会感到惊讶。
我相信click
通过 jQuery 调用实际上并不会真正触发对元素的点击,而是调用监听点击的函数。因此,尽管您正在调用click()
,但实际上只是在调用一个函数。
当用户点击时,它是真正的点击。
例子:
var handler = function () {
alert('hi');
};
$('#example').on('click', handler);
$('#example').click(); // really just calls handler();
浏览器的本机代码处理实际的鼠标单击事件(来自操作系统)并创建浏览器事件对象。在浏览器的本机代码中,浏览器知道该事件是由真正的鼠标单击创建的。
我的猜测是事件中附加了一些隐藏数据(无法从 javascript 访问),这让浏览器可以跟踪事件是否是通过真正的鼠标单击启动的,尽管也可能存在其他实现机制。