是否可以确定元素是否具有单击处理程序,或更改处理程序,或使用jQuery绑定到它的任何类型的事件处理程序?
此外,是否可以确定它对于给定类型的事件有多少点击处理程序(或任何类型的事件处理程序),以及事件处理程序中有哪些功能?
您可以从数据缓存中获取此信息.
例如,将它们记录到控制台(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() ); }); });
另一种方法是你可以使用下面的书签,但显然这在运行时没有帮助.
当绑定不存在时终止绑定不是最好的解决方案,但似乎足够有效!第二次"点击"时,您可以肯定地知道它不会创建重复的绑定.
因此我使用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
希望这可以帮助.
自jQuery 1.8以来,我们不再支持此解决方案,因为我们可以在博客上阅读:
$(element).data("events"):现在在1.8中删除了它,但您仍然可以通过$ ._ data(element,"events")获取事件数据以进行调试. 请注意,这不是受支持的公共接口; 实际的数据结构可能会因版本不同而发生变化.
因此,您应该取消绑定/重新绑定它,或者只是使用布尔值来确定您的事件是否已被附加(在我看来这是最佳解决方案).
我想这可能已经用jQuery 1.9更新了.*
我发现这是目前唯一对我有用的东西:
$._data($("#yourElementID")[0]).events
我写了一个名为"once"的非常小的插件,它可以做到这一点:
$.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'));
此外,至少在jQuery 1.5中我认为你需要小心使用$(target).data('events'),因为它对于已经绑定到上述对象的事件的返回方式不同.
你需要做一些事情:
var events = $(target).data("events"); if(typeof events === "function"){ events = events.events; }
我正在使用这种方法并且它有效,但感觉有点像我受jquery内部的摆布,我真的不应该这样做!