测试事件处理程序是否绑定到jQuery中的元素

时间:2009-08-05 22:19:33

标签: javascript jquery

是否可以使用jQuery确定元素是否具有单击处理程序,更改处理程序或绑定到它的任何类型的事件处理程序?

此外,是否可以确定它对于给定类型的事件有多少点击处理程序(或任何类型的事件处理程序),以及事件处理程序中有哪些函数?

10 个答案:

答案 0 :(得分:141)

您可以从数据缓存中获取此信息。

例如,将它们记录到控制台(firebug,ie8):

console.dir( $('#someElementId').data('events') );

或迭代它们:

jQuery.each($('#someElementId').data('events'), function(i, event){

    jQuery.each(event, function(i, handler){

        console.log( handler.toString() );

    });

});

另一种方法是你可以使用以下bookmarklet但显然这在运行时没有帮助。

答案 1 :(得分:124)

当绑定不存在时终止绑定不是最好的解决方案,但似乎足够有效!第二次“点击”时,您可以肯定地知道它不会创建重复的绑定。

因此我使用die()或unbind():

$("#someid").die("click").live("click",function(){...

$("#someid").unbind("click").bind("click",function(){...

或最近的jQuery版本:

$("#someid").off("click").on("click",function(){...

答案 2 :(得分:34)

我编写了一个名为hasEventListener的插件,它正是这样做的:

http://github.com/sebastien-p/jquery.hasEventListener

希望这有帮助。

答案 3 :(得分:17)

自jQuery 1.8以来,我们不再支持此解决方案,因为我们可以在博客上阅读:

  

$(element).data(“events”):现在已经在1.8中删除了,但你仍然可以进入   用于调试目的的事件数据通过$ ._ data(element,“events”)。   请注意,这不是受支持的公共接口;实际数据   结构可能会因版本不同而发生变化。

所以,你应该取消绑定/重新绑定它,或者简单地使用布尔值来确定你的事件是否被附加(在我看来是最好的解决方案)。

答案 4 :(得分:15)

我认为这可能已经使用jQuery 1.9更新了。*

我发现这是目前唯一对我有用的东西:

$._data($("#yourElementID")[0]).events

答案 5 :(得分:10)

我写了一个名为“once”的非常小的插件,它可以做到这一点:

$.fn.once = function(a, b) {
    return this.each(function() {
        $(this).off(a).on(a,b);
    });
};

简单地说:

$(element).once('click', function(){
});

答案 6 :(得分:5)

我认为提到的hasEventListener插件不会处理自定义事件,例如

var obj = {id:'test'};
$(obj).bind('custom', function(){
    alert('custom');
}).trigger('custom');

alert($(obj).hasEventListener('custom'));

此外,至少在jQuery 1.5中我认为你需要小心使用$(target).data('events'),因为它对于已经绑定到上述对象的事件的返回方式不同。

您需要执行以下操作:

var events = $(target).data("events");
if(typeof events === "function"){
   events = events.events;
}

我正在使用这种方法并且它有效但感觉有点像我受jquery内部的摆布而且我真的不应该这样做!

答案 7 :(得分:2)

我有同样的需求&快速修补现有代码,以便能够执行以下操作:

 if( $('.scroll').hasHandlers('mouseout') )  // could be click, or '*'...
 { 
   ... code ..
 }

它也适用于事件委托:

 if ( $('#main').hasHandlers('click','.simple-search') )  ...

可在此处找到:jquery-handler-toolkit.js

答案 8 :(得分:1)

参考SJG's answerW3Schools.com

  

从jQuery 1.7开始,off()方法是unbind(),die()和undelegate()方法的新替代品。此方法为API带来了很多一致性,我们建议您使用此方法,因为它简化了jQuery代码库。

这给出了:

$("#someid").off("click").live("click",function(){...

$("#someid").off("click").bind("click",function(){...

答案 9 :(得分:-6)

这对我有用: $( '#配置文件1')。ATTR(的 'onClick')