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

Eli*_*ria 191 javascript jquery

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

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

red*_*are 140

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

例如,将它们记录到控制台(firebug,ie8):

console.dir( $('#someElementId').data('events') );
Run Code Online (Sandbox Code Playgroud)

或者迭代它们:

jQuery.each($('#someElementId').data('events'), function(i, event){

    jQuery.each(event, function(i, handler){

        console.log( handler.toString() );

    });

});
Run Code Online (Sandbox Code Playgroud)

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

  • 只需注意:`$(element).data('events')`已在jQuery 1.8中删除.对于"调试,你可以使用`$ ._ data(element,'events')`,但它没有文档(可能会改变).http://blog.jquery.com/2012/08/09/jquery-1-8 -released / (77认同)
  • 是拉斯,我是真的.但内联处理程序是严峻的,不值得展示! (7认同)
  • @redsquare当然我已经预料到了.您可以查看数百个不断更新的热门答案. (4认同)
  • 这只适用于分配了jQuery的事件处理程序吗? (2认同)
  • 很好的答案.我只想提一下,这不适用于附带`live`(jQuery 1.4.4,FF)的事件. (2认同)
  • @gotqn你希望每个人都更新他们的所有答案,以便与新的api保持联系,注意答案的日期..... (2认同)
  • $ ._数据($( "#元件")[0]).事件 (2认同)
  • 这些解决方案不再有效.您现在必须手动设置布尔变量. (2认同)

SJG*_*SJG 126

当绑定不存在时终止绑定不是最好的解决方案,但似乎足够有效!第二次"点击"时,您可以肯定地知道它不会创建重复的绑定.

因此我使用die()或unbind(),如下所示:

$("#someid").die("click").live("click",function(){...
Run Code Online (Sandbox Code Playgroud)

要么

$("#someid").unbind("click").bind("click",function(){...
Run Code Online (Sandbox Code Playgroud)

或者在最近的jQuery版本中:

$("#someid").off("click").on("click",function(){...
Run Code Online (Sandbox Code Playgroud)

  • 尽管它没有回答这个问题,但+1非常整洁. (6认同)
  • 对于jQuery 1.7及更高版本,使用`.off("click")`而不是`.die()`或`.unbind()` (6认同)
  • 那对我有帮助!谢谢 :) (3认同)
  • 我想为这个简单的解决方案给你1000 + 1. (3认同)
  • 我想补充一点,如果你需要附加一个只运行一次然后自行删除的事件,请使用one()方法.$("body").one("click",function(){alert('test');}); (2认同)

小智 35

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

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

希望这可以帮助.

  • 喜欢......你有机会提供兼容1.9的版本吗? (5认同)
  • 对于使用jQuery的任何人来说,这个插件应该是公认的答案. (2认同)
  • 为什么jQuery本身不是这个部分!干得好+1 (2认同)

adr*_*nat 17

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

$(element).data("events"):现在在1.8中删除了它,但您仍然可以通过$ ._ data(element,"events")获取事件数据以进行调试. 请注意,这不是受支持的公共接口; 实际的数据结构可能会因版本不同而发生变化.

因此,您应该取消绑定/重新绑定它,或者只是使用布尔值来确定您的事件是否已被附加(在我看来这是最佳解决方案).


jtr*_*ans 15

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

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

$._data($("#yourElementID")[0]).events
Run Code Online (Sandbox Code Playgroud)


Rod*_*ira 10

我写了一个名为"once"的非常小的插件,它可以做到这一点:

$.fn.once = function(a, b) {
    return this.each(function() {
        $(this).off(a).on(a,b);
    });
};
Run Code Online (Sandbox Code Playgroud)

简单地说:

$(element).once('click', function(){
});
Run Code Online (Sandbox Code Playgroud)

  • 这似乎与jQuery的`.one`相同-http://api.jquery.com/one/-从v1.1开始就存在。您只是添加了一个额外的“ c”。 (2认同)

Lea*_*ple 10

对于jQuery 1.9+

var eventListeners = $._data($('.classname')[0], "events");
Run Code Online (Sandbox Code Playgroud)

我需要[0]数组文字.


Jul*_*lfs 5

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

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

alert($(obj).hasEventListener('custom'));
Run Code Online (Sandbox Code Playgroud)

此外,至少在jQuery 1.5中我认为你需要小心使用$(target).data('events'),因为它对于已经绑定到上述对象的事件的返回方式不同.

你需要做一些事情:

var events = $(target).data("events");
if(typeof events === "function"){
   events = events.events;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用这种方法并且它有效,但感觉有点像我受jquery内部的摆布,我真的不应该这样做!