我注意到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;
}
但是,必须将其添加到所有事件处理程序中真的很烦人。有没有更好的方法让事件处理程序像普通的点击处理程序一样点火?
答案 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之间的区别并不重要。