【问题标题】:test if event handler is bound to an element in jQuery [duplicate]测试事件处理程序是否绑定到jQuery中的元素[重复]
【发布时间】:2010-11-17 04:32:30
【问题描述】:

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

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

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

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

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

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

    【讨论】:

    • 这是否仅适用于使用 jQuery 分配的事件处理程序?
    • 是的,拉斯,我说的是真的。但是内联处理程序很糟糕,不应该展示!
    • 很好的答案。我只想提一下,这不适用于live (jQuery 1.4.4, FF) 附加的事件。
    • 请注意:$(element).data('events') 已在 jQuery 1.8 中删除。对于“调试,您可以使用$._data(element, 'events'),但它没有记录(并且可能会更改)。blog.jquery.com/2012/08/09/jquery-1-8-released
    • @redsquare 当然我已经预料到了。您可以查看数百个不断更新的热门答案。
    【解决方案2】:

    对于 jQuery 1.9+

    var eventListeners = $._data($('.classname')[0], "events");
    

    我需要 [0] 数组字面量。

    【讨论】:

      【解决方案3】:

      我写了一个非常小的插件,叫做“once”:

      $.fn.once = function(a, b) {
          return this.each(function() {
              $(this).off(a).on(a,b);
          });
      };
      

      简单地说:

      $(element).once('click', function(){
      });
      

      【讨论】:

      • 这似乎与 jQuery 自己的 .one -- api.jquery.com/one -- 相同 -- 自 v1.1 以来一直存在。您的只是添加了一个额外的“c”。
      • @Luke 我知道这是旧的,但你错了。据我了解,这是不同的,因为 jQuery.one() 只允许事件在自删除之前运行(触发)一次。这个 .once() 函数只是确保在绑定替换之前删除任何现有的处理程序(然后可以触发多次)。也许函数名称是令人困惑的部分,也许更好地认为是 $.fn.replaceOn()?
      【解决方案4】:

      我也有同样的需求并迅速修补了现有代码,以便能够执行以下操作:

       if( $('.scroll').hasHandlers('mouseout') )  // could be click, or '*'...
       { 
         ... code ..
       }
      

      它也适用于事件委托:

       if ( $('#main').hasHandlers('click','.simple-search') )  ...
      

      这里有:jquery-handler-toolkit.js

      【讨论】:

        【解决方案5】:

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

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

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

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

        或在最近的 jQuery 版本中:

        $("#someid").off("click").on("click",function(){...
        

        【讨论】:

        • +1 非常简洁,即使它没有回答问题。
        • 这是最好的方法,也是有效的方法,当其他方法失败时对我有用
        • 对于 jQuery 1.7 及更高版本,使用 .off("click") 而不是 .die().unbind()
        • 这是创可贴。找出代码执行两次的原因并修复该错误是一个更好的主意。或者找出在哪里调用绑定并阻止它。
        • 我要补充一点,如果您需要附加一个仅运行一次然后自行删除的事件,请使用 one() 方法。 $("body").one("click",function(){ alert('test');});
        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

          参考SJG's answer和来自W3Schools.com

          从 jQuery 1.7 版开始,off() 方法是 unbind()、die() 和 undelegate() 方法的新替代品。这种方法给 API 带来了很大的一致性,我们建议您使用这种方法,因为它简化了 jQuery 代码库。

          这给出了:

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

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

          【讨论】:

          • bind 现在已被弃用,所以最好使用$("#someid").off("click").on("click",function(){...
          【解决方案8】:

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

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

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

          【讨论】:

          • 是否说明了它被删除的原因?
          • 因为 jQuery 使用 (.data) 来存储其内部事件逻辑。
          • $._data 现在是做什么的?
          • 我刚刚找到this,它解释了一切:)
          • 你会在哪里设置布尔值?
          【解决方案9】:

          这对我有用: $('#profile1').attr('onclick')

          【讨论】:

          • 它仅在通过“onclick”属性附加处理程序时才有效。这个案例怎么样:$('#profile1').click(function(){alert('')});$('#profile1').attr('onclick') 返回undefined
          【解决方案10】:

          我认为提到的 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 内部的摆布,我真的不应该这样做!

          【讨论】:

            【解决方案11】:

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

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

            希望这会有所帮助。

            【讨论】:

            • 这个插件应该是任何使用 jQuery 的人都可以接受的答案。
            • 希望我可以为别人节省一些时间。 hasEventListener 不适用于live 绑定事件。 (v1.0.5)
            • 我的 hasEventListener 插件将在本周更新,现在全面支持实时和委派事件。
            • 为什么这部分不是 jQuery 原生的!!!干得好+1
            • 喜欢...您是否有机会提供 1.9 兼容版本?
            猜你喜欢
            • 1970-01-01
            • 2014-03-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-04
            相关资源
            最近更新 更多