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

IT技术 javascript jquery
2021-02-10 09:43:42

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

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

6个回答

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

例如,将它们记录到控制台(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() );

    });

});

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

很好的答案。我只想提一下,这不适用于live(jQuery 1.4.4, FF)附带的事件
2021-03-19 09:43:42
这仅适用于使用 jQuery 分配的事件处理程序吗?
2021-03-20 09:43:42
@redsquare 当然,我已经预料到了。您可以查看数百个不断更新的热门答案。
2021-03-20 09:43:42
是的,Russ,我是真的。但是内联处理程序是严峻的,不应该被展示!
2021-03-23 09:43:42
请注意:$(element).data('events')已在 jQuery 1.8 中删除。对于“调试,您可以使用$._data(element, 'events'),但它没有记录(并且可能会更改)。blog.jquery.com/2012/08/09/jquery-1-8-released
2021-04-10 09:43:42

在绑定尚不存在时将其杀死并不是最好的解决方案,但似乎足够有效!第二次“单击”时,您可以确定它不会创建重复绑定。

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

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

或者

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

或在最近的 jQuery 版本中:

$("#someid").off("click").on("click",function(){...
对于 jQuery 1.7 及更高版本,使用.off("click")代替.die().unbind()
2021-03-14 09:43:42
+1 非常整洁,即使它没有回答问题。
2021-03-17 09:43:42
这是最好的方式,也是工作方式,当其他方式失败时对我有用
2021-03-18 09:43:42
这是创可贴。找出代码执行两次的原因并修复该错误是一个更好的主意。或者找出其他地方正在调用绑定并阻止它。
2021-03-26 09:43:42
我想补充一点,如果您需要附加一个只运行一次然后自行删除的事件,请使用 one() 方法。$("body").one("click",function(){ alert('test');});
2021-04-05 09:43:42

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

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

希望这可以帮助。

我的 hasEventListener 插件将在本周更新,现在完全支持实时和委托事件。
2021-03-18 09:43:42
比如……你有没有机会提供一个 1.9 兼容版本?
2021-03-20 09:43:42
希望我能拯救别人一些时间。hasEventListener 不适用于live绑定事件。(v1.0.5)
2021-03-30 09:43:42
为什么 jQuery 的这部分不是本机的!!!干得好 +1
2021-04-01 09:43:42
对于任何使用 jQuery 的人来说,这个插件应该是公认的答案。
2021-04-06 09:43:42

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

$(element).data(“events”):现在在 1.8 中被移除了,但是你仍然可以通过 $._data(element, "events") 获取事件数据以进行调试。 请注意,这不是受支持的公共接口;实际的数据结构可能会因版本而异。

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

因为它被 jQuery 使用 (.data) 来存储其内部事件逻辑。
2021-03-12 09:43:42
有没有说明为什么它被删除的原因?
2021-03-20 09:43:42
你会在哪里设置布尔值?
2021-03-22 09:43:42
$._data现在是什么
2021-04-04 09:43:42
我刚找到这个,它解释了一切:)
2021-04-09 09:43:42

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

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

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