Javascript jQuery实时(';单击';)触发右键单击
我注意到jQuery中Javascript jQuery实时(';单击';)触发右键单击,javascript,html,event-handling,jquery,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"); retu
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;
}
但是,必须将其添加到所有事件处理程序中,这真的很烦人。有没有更好的方法让事件处理程序只像普通的点击处理程序一样启动?这是一个:
Firefox似乎没有启动一个
单击“事件”选项卡上的元素
单击鼠标右键,但会触发
mousedown和mouseup。但是,
是否在文档
上触发单击事件!自从.live
捕获
它可以看到文档级别的事件
元素的单击事件为偶数
尽管元素本身没有。如果
您可以使用mouseup之类的事件
p
元素和文档
我将观看比赛
您的解决方案是目前所能做的最好的。它似乎只影响Firefox(我相信这实际上是Firefox中的一个bug,而不是jQuery本身)
参见昨天的提问。这是如何实现
live
的不幸后果。它实际上使用事件冒泡,因此您没有绑定到锚元素的click事件,而是绑定到文档的click事件。我找到了一个解决方案—“修复”live()
代码本身
在jQuery 1.3.2的未统一源代码中,第2989行附近有一个名为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元素时调用它,它应该具有预期的结果(右键单击事件不会触发)。我使用mousedown事件解决了这个问题。在我的情况下,鼠标向下和点击之间的区别并不重要。不,Firefox右键点击的方式有一个缺陷。请看@crescentfresh:我不确定有多少人相信一篇文章说“Macintosh版本的Safari当然不会受到这些问题的影响,因为Macintosh只有一个鼠标键”——我上一次使用带有单键鼠标的Mac是在TBL发明Web之前;-)你将来怎么问问题?我很高兴看到你在这里的解决方法,并立即在我自己的应用程序上尝试了这一点,尽管我现在右键单击的链接可以被捕获并忽略,但我仍然没有在这些应用程序上看到我的右键单击上下文菜单。此外,我的鼠标中键单击(在新选项卡中打开)也不起作用。但是,至少处理程序可以提前返回!实际上,如果我反复快速地右键单击,我偶尔会看到上下文菜单。。。。嗯,在Firefox中使用
live
时,似乎双击鼠标右键会一直为我打开一个上下文菜单……是的,但这违背了live()
的目的,不是吗?是的,但是live(click)的行为与普通的click()不同,如果你检测到按下了哪个按钮,它可以被修复,但是,您需要确切地知道使用了哪种浏览器(即早期版本的行为不同于较新版本,所有其他浏览器的行为方式都是“正确的”)。目前这是一个更加优雅的解决方案。
function reattachEvents(){
$(element).unbind('click').click(function(){
//do something
});
}