jQuery live(’click’)触发右键单击

我注意到jQuery中live()函数的一个奇怪的行为:

 normal live $('#normal').click(clickHandler); $('#live').live('click', clickHandler); function clickHandler() { alert("Clicked"); return false; } 

在您右键单击“实时”链接并触发处理程序,然后不显示上下文菜单之前,这很好,很花哨。 事件处理程序根本不会在“普通”链接上触发(如预期的那样)。

我已经能够通过将处理程序更改为:

 function clickHandler(e) { if (e.button != 0) return true; // normal handler code here return false; } 

但是,必须将其添加到所有事件处理程序中真的很烦人。 有没有更好的方法让事件处理程序像普通的点击处理程序一样点火?

这是一个众所周知的问题 :

似乎Firefox不会在右键单击时触发元素的click事件,尽管它会触发mousedown和mouseup。 但是,它触发document上的click事件! 由于.live捕获文档级别的事件,因此它会看到元素的click事件,即使元素本身没有。 如果您使用像mouseup这样的事件,则p元素和document都将看到该事件。

您的解决方法是您现在可以做的最好的方法。 它似乎只影响Firefox(我相信它实际上是Firefox中的一个错误,而不是jQuery本身)。

另见昨天提出的这个问题 。

我找到了一个解决方案 – “修复” live()代码本身。

在第2989行的jQuery 1.3.2的未经授权的源代码中,有一个名为liveHandler()的函数。 修改代码以添加一行:

 2989: function liveHandler(event) { 2990: if (event.type == 'click' && event.button != 0) return true; 

除了鼠标左键,这将阻止点击事件触发任何内容。 如果你特别想要的话,你可以很容易地修改代码以允许“右键单击”事件,但这对我有用,所以它仍然存在。

您实际上可以将其重写为:

 function reattachEvents(){ $(element).unbind('click').click(function(){ //do something }); } 

并在添加新的dom元素时调用它,它应该具有预期的结果(右击事件不会触发)。

这是实施live一个不幸后果。 它实际上使用了事件冒泡,所以你没有绑定到anchor元素的click事件,你绑定到文档的click事件。

我通过使用mousedown事件解决了这个问题。 在我的情况下,mousedown和click之间的区别并不重要。