2012-06-19 20 views
15

如果我发起一个点击jQuery的window.open(),它会被弹出窗口拦截器阻止,如果我手动点击窗口不会被阻止。这两种浏览器有何不同?浏览器如何区分用户点击和编程点击之间的区别?

+1

这里是一个[jsfiddle](http://jsfiddle.net/twMSG/1/)来演示。它会尝试在网页加载时弹出,但会被阻止。以编程方式调用'click'事件会导致它被阻塞,但如果在另一个单击事件中调用它,则会通过该事件。 – sachleen

回答

6

Firefox的实现,这是在长度上this bug讨论,并this other bug有一些更有趣的背景,包括哪些长度网站会以强加给不知情的用户不想要的弹出窗口(在这种情况下经历:从主叫window.open()在图像load事件中)。如果你在Bugzilla中搜索,你会发现Mozilla的人花了好几年的时间才能正常工作,例如here's a bug from 2001

它目前的工作方式是这样的:当Firefox从操作系统获得了点击事件,在JavaScript的(寻找dom.disable_open_click_delayabout:config)启用了一定的时间window.open()。如果您从代码中调用click()事件而没有发生用户点击,则第一步中,不会出现window.open()的启用,尽管对window.open()的调用本身将成功to stop sites detecting that you have popup blocking enabled

我不确定其他浏览器是如何实现这个功能的,但是如果它有很大的不同,我会很惊讶。

1

我相信通过jQuery调用click实际上并不真正触发单击元素,而是调用监听点击的函数。所以尽管你打电话给click()你实际上只是在调用一个函数。

当用户点击时,这是一个真正的点击。

实施例:

var handler = function() { 
    alert('hi'); 
}; 

$('#example').on('click', handler); 
$('#example').click(); // really just calls handler(); 
+0

原生javascript .click()也是如此吗? – nbrooks

+1

有趣的事情要注意:如果你作为用户,做任何事情导致点击代码被执行,它仍然会。这包括点击调用'click'事件的东西。甚至一个关键的新闻事件都可以调用它,它会起作用。 – sachleen

+0

很难预测浏览器如何实现此检查,因为规范中没有任何内容规定何时应该提示用户。 http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-2651361 – Fenton

0

浏览器的本地代码处理实际鼠标点击事件(从操作系统)并创建浏览器事件对象。在浏览器的本机代码中,浏览器知道这个事件是由一个真正的鼠标点击创建的。

我的猜测是,有一些隐藏的数据(无法从JavaScript访问)附加到事件,让浏览器跟踪事件是否是通过鼠标点击发起的,尽管可能有其他的实现机制太。

相关问题