如果我使用window.open()
的jquery启动点击,则会被弹出窗口阻止程序阻止,如果我手动执行单击,则窗口不会被阻止。浏览器如何在两者之间有所不同?
答案 0 :(得分:6)
在this bug上详细讨论了Firefox的实现,this other bug还有一些有趣的背景,包括网站为了在不知情的用户上添加不需要的弹出窗口而经历的长度(在这种情况下:从图像window.open()
事件中调用load
。如果你在Bugzilla周围搜索,你会发现Mozilla人花了很多年才能使这一切正常工作,例如here's a bug from 2001。
目前的工作方式是:当Firefox从操作系统收到点击事件时,在JavaScript中启用了window.open()
一段时间dom.disable_open_click_delay
about:config
})。如果您在没有用户点击的情况下从代码中调用click()
事件,那么第一步就是window.open()
的启用永远不会发生,尽管对window.open()
的调用本身会成功to stop sites detecting that you have popup blocking enabled
我不确定其他浏览器是如何实现这些东西的,但如果它有很大的不同,我会感到很惊讶。
答案 1 :(得分:1)
我相信通过jQuery调用click
实际上并没有真正触发元素的点击,而是调用听取点击的函数。因此,虽然您正在调用click()
,但实际上您只是在调用函数。
当用户点击时,这是一次真正的点击。
示例:
var handler = function () {
alert('hi');
};
$('#example').on('click', handler);
$('#example').click(); // really just calls handler();
答案 2 :(得分:0)
浏览器的本机代码处理实际的鼠标单击事件(来自操作系统)并创建浏览器事件对象。在浏览器的本机代码中,浏览器知道此事件是通过真正的鼠标点击创建的。
我的猜测是,有一些隐藏数据(无法通过javascript访问)附加到该事件,让浏览器跟踪事件是否是通过真正的鼠标点击启动,尽管也可能有其他实现机制