testing如果事件处理程序绑定到jQuery中的元素

是否有可能确定一个元素是否有一个点击处理程序,或更改处理程序,或任何types的事件处理程序绑定到它使用jQuery?

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

您可以从数据caching中获取这些信息。

//将它们logging到控制台(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() ); }); }); 

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

当不存在的时候closures绑定并不是最好的解决scheme,但似乎足够有效! 第二次点击时,您可以确定地知道它不会创build重复的绑定。

因此,我使用die()或unbind()像这样:

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

要么

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

或者在最近的jQuery版本中:

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

我写了一个名为hasEventListener的插件,它的确如此:

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

希望这可以帮助。

这个解决scheme不再支持自jQuery 1.8,因为我们可以在这里阅读博客:

$(element).data(“events”):现在在1.8版本中被删除,但是仍然可以通过$ ._ data(element,“events”)debugging事件数据。 请注意,这不是一个受支持的公共接口; 实际的数据结构可能从版本到版本不兼容。

所以,你应该解除绑定/重新绑定或简单地使用布尔值来确定您的事件是否已附加(这在我看来是最好的解决scheme)。

我想这可能已经更新了jQuery 1.9。*

我发现这是目前唯一适合我的东西:

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

我写了一个非常小的名为“一次”的插件,这样做:

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

简而言之:

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

对于jQuery 1.9+

 var eventListeners = $._data($('.classname')[0], "events"); 

我需要[0]数组文字。

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

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

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

您需要执行以下操作:

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

我正在使用这种方法,它的工作,但有点像我在jquery内部的摆布,我真的不应该这样做!

参考SJG的答案和W3Schools.com

从jQuery版本1.7开始,off()方法是unbind(),die()和undelegate()方法的新替代品。 这个方法给API带来了很多的一致性,我们推荐你使用这个方法,因为它简化了jQuery代码库。

这给了:

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

要么

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

我有同样的需要,并迅速修补现有的代码,以便能够做到这样的事情:

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

它也适用于事件委托:

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

它可以在这里find: jquery-handler-toolkit.js

这适用于我:$('#profile1')。attr('onclick')