是否可以使用 jQuery 确定元素是否具有单击处理程序、更改处理程序或绑定到它的任何类型的事件处理程序?
此外,是否可以确定给定类型的事件有多少点击处理程序(或任何类型的事件处理程序),以及事件处理程序中有哪些功能?
是否可以使用 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