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

时间:2009-09-28 23:14:26

标签: javascript html event-handling jquery

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

<a href="#" id="normal">normal</a>
<a href="#" id="live">live</a>

$('#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;
}

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

5 个答案:

答案 0 :(得分:9)

这是known issue

  

似乎Firefox没有开火   单击a上的元素的事件   右键单击,虽然它会触发   mousedown和mouseup。但是,它    点击document上的点击事件!自.live捕获以来   它看到了文档层面的事件   即使是元素的click事件   虽然元素本身没有。如果   你使用像mouseup这样的事件   p元素和document   会看到这个事件。

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

另见昨天提到的this question

答案 1 :(得分:4)

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

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

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

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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