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(){...
这个解决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')