取消jQuery事件处理

11

我已经按照以下方式设置了onclick事件处理程序:

element.onclick = function() { /*code */ }

想象一下,使用jQuery的bind()方法或类似处理程序设置了事件处理程序。

$('element').bind('click', function(){/*another function*/})
如何避免调用使用jQuery定义的处理程序,从而避免影响我在开头描述的处理程序?
注意stopPropagation()等jQuery方法无法从该函数中起作用,因为它是通过本机事件对象传递的。
4个回答

8

我不确定你的问题是什么,但也许这会有所帮助:

您可以通过jQuery提供的事件构造函数创建一个新的事件对象(符合W3C DOM标准):

例如:

element.onclick = function(e) {
    var aBetterEventObject = jQuery.Event(e);
    // Now you can do what you want: (Cross-browser)
    aBetterEventObject.preventDefault()
    aBetterEventObject.isDefaultPrevented()
    aBetterEventObject.stopPropagation()
    aBetterEventObject.isPropagationStopped()
    aBetterEventObject.stopImmediatePropagation()
    aBetterEventObject.isImmediatePropagationStopped()
}

编辑:再次阅读您的问题,我认为传播不是问题 - 您似乎想要在事件处理程序内取消事件处理程序的运行 - 我不确定这是可能的。您可以解除绑定所有处理程序(jQuery(elem)。unbind('click')),但我不认为这是您想要的...

5

尝试在jQuery事件处理程序中添加以下行:

return false;

5
跟随JimmyP的回答,我已经尝试过这个方法。
$('#x').click( function(e){
    alert('hello');
});
document.getElementById('x').onclick = function(){
    $('#x').unbind('click');
    alert("goodbye");
}

在这个例子中,jQuery事件只运行一次。无论您如何定义处理程序的顺序,我认为您不能依赖于它们被调用的顺序,因此我猜您将不得不接受jQuery事件可能会触发一次的事实。首先添加onclick确实可以完全防止jQuery事件的触发,但是正如我所说,我认为这并不可靠。


正如我所解释的,unbind将永久丢弃警报“hello”的处理程序。这不好 :)使用情况可能是:document.getElementById('x').onclick = function() { if ( /some case/ ) { /* prevent calling function alerting 'HELLO' */ } } 因此,当我在元素上再次单击时,情况可能为false,处理程序应该被调用。我清楚吗? :) - glaz666
+1 我认为你无法保证调用事件处理程序的顺序。 - Grey Panther

2
Jquery有一种方法用于给事件设定命名空间。你可以通过命名空间来添加、触发和删除与同一事件绑定的不同函数。http://docs.jquery.com/Namespaced_Events
$("a").bind("click.custom1",function(){ ... });
$("a").bind("click.custom2",function(){ ... });
$("a").trigger("click.custom2");
$("a").unbind("click.custom2");

只要解除命名空间事件,您的常规onclick就不会受到影响。如果这样不起作用,您可能需要绑定两个单独的命名空间到点击事件。请保留HTML标签。

不幸的是,我只能更改与内联方法附加的处理程序。我无法影响使用jQuery绑定 - 当另一个开发人员重用我的代码时可以完成此操作。 - glaz666
我正在开发一种插件。简而言之,对于某些情况,它应该防止由元素上发生的事件引起的任何活动。例如,它应该防止在某些事件上触发任何事件处理程序。处理程序可以由用户使用jQuery或内联技术附加。 - glaz666
[继续...]我只能在内联处理程序中进行干预,以在之前添加我的内容,从而取消该处理程序。之后将调用jQuery设置的处理程序。我想要阻止这种情况发生。 - glaz666
我认为你无法保证事件处理程序的调用顺序 - 可能在你的事件触发之前jQuery处理程序已经执行过了... - Grey Panther
这并不意味着它总是会第一个触发。 - montrealist
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接