【问题标题】:Check if event exists on element [duplicate]检查元素上是否存在事件[重复]
【发布时间】:2010-12-03 15:47:40
【问题描述】:

有没有办法检查 jQuery 中是否存在事件?我正在开发一个使用自定义命名空间事件的插件,并且希望能够检查该事件是否绑定到一个元素。

【问题讨论】:

  • 那么,在 1.8 中,这一切都错了吗?
  • @SkylarSaveland 方法 $.data(element, "events") 从来都不是官方的。但是在 jQuery 1.8.0 中,这个方法通过$._data(element, "events") 离开了。阅读更多here

标签: javascript jquery jquery-events eventtrigger


【解决方案1】:

要检查元素上的事件:

var events = $._data(element, "events")

请注意,这仅适用于直接事件处理程序,如果您使用 $(document).on("event-name", "jq-selector", function() { //logic }),您将需要查看此答案底部的 getEvents 函数

例如:

 var events = $._data(document.getElementById("myElemId"), "events")

 var events = $._data($("#myElemId")[0], "events")

完整示例:

<html>
    <head>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js" type="text/javascript"></script>
        <script>
            $(function() {
                $("#textDiv").click(function() {
                    //Event Handling
                });
                var events = $._data(document.getElementById('textDiv'), "events");
                var hasEvents = (events != null);
            });
        </script>
    </head>
    <body>
        <div id="textDiv">Text</div>
    </body>
</html>

一种更完整的检查方式,包括动态侦听器,使用 $(document).on 安装

function getEvents(element) {
    var elemEvents = $._data(element, "events");
    var allDocEvnts = $._data(document, "events");
    for(var evntType in allDocEvnts) {
        if(allDocEvnts.hasOwnProperty(evntType)) {
            var evts = allDocEvnts[evntType];
            for(var i = 0; i < evts.length; i++) {
                if($(element).is(evts[i].selector)) {
                    if(elemEvents == null) {
                        elemEvents = {};
                    }
                    if(!elemEvents.hasOwnProperty(evntType)) {
                        elemEvents[evntType] = [];
                    }
                    elemEvents[evntType].push(evts[i]);
                }
            }
        }
    }
    return elemEvents;
}

示例用法:

getEvents($('#myElemId')[0])

【讨论】:

  • 我认为你可以通过使用来简化这个:var eventBound = (events != null);
  • 此解决方案适用于 jQuery 1.8.0 之后的版本。非常感谢Ton Gerken :)
  • 这应该是公认的答案,它处理动态应用的事件处理程序,即使代码很少。谢谢!
【解决方案2】:

使用 jquery 事件过滤器

你可以这样使用它

$("a:Event(click)")

【讨论】:

  • 哈,谢谢,几个月前得到 meder 的回答后构建了那个插件。
  • 从 1.8 开始,此插件不再有效
  • 我喜欢这个,发布一个插件 OP 作为对他的问题的回答 :)
【解决方案3】:

这项工作对我来说是显示已发生事件的对象和类型。

    var foo = $._data( $('body').get(0), 'events' );
    $.each( foo, function(i,o) {
    console.log(i); // guide of the event
    console.log(o); // the function definition of the event handler
    });

【讨论】:

    【解决方案4】:

    我最终这样做了

    typeof ($('#mySelector').data('events').click) == "object"
    

    【讨论】:

      【解决方案5】:

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

      希望这会有所帮助。

      【讨论】:

      • 问题是,它是如何工作的?我已经做了几个小时了,但仍然不清楚。我只想检查它是否有点击事件,并得到一个布尔值,而不是一个对象,但是您提供的大多数方法,至少是示例,都复杂得多。有趣的是:codingjack.com/playground/jquick/#haseventlistener,但我没有使用 jquick,但我喜欢这种干净的简单性。
      【解决方案6】:

      以下代码将为您提供给定选择器上的所有点击事件:

      jQuery(selector).data('events').click
      

      您可以使用 each 或 for ex 对其进行迭代。检查长度以进行验证,例如:

      jQuery(selector).data('events').click.length
      

      认为它会帮助某人。 :)

      【讨论】:

      • 在 jQuery >= 1.8 中不再工作。请参阅 Tom Gerken 的回答以获得可行的解决方案。
      【解决方案7】:

      你可以使用:

      $("#foo").unbind('click');
      

      确保所有点击事件都未绑定,然后附加您的事件

      【讨论】:

      • 如果您使用 live 来注册活动,则无济于事。 stackoverflow.com/questions/12755646/…
      • 问题是检查元素上是否存在事件,而不是如何取消绑定现有事件...
      • @Avi,这仍然是一个很好的答案,因为在许多情况下,这个问题是在考虑问题的情况下提出的:“如何不注册两次处理程序?”
      • 如果您不想破坏在其他地方注册的事件,这将不起作用
      • 同意:不是对 OP 的严格回答,但正是我需要的 ;)
      【解决方案8】:
      $('body').click(function(){ alert('test' )})
      
      var foo = $.data( $('body').get(0), 'events' ).click
      // you can query $.data( object, 'events' ) and get an object back, then see what events are attached to it.
      
      $.each( foo, function(i,o) {
          alert(i) // guid of the event
          alert(o) // the function definition of the event handler
      });
      

      您可以通过将对象引用(虽然不是 jQuery 对象)提供给 $.data 来进行检查,并且对于第二个参数提供“事件”,这将返回一个填充了所有事件(例如“点击”)的对象。您可以遍历该对象并查看事件处理程序的作用。

      【讨论】:

      • 我实际上更喜欢您的第一个示例,$.data(elem, 'events') 提供了更多信息。
      • 你为什么不直接使用 $('body').data('events')?
      • 给我一个错误“$.data($('#myDiv').get(0), "events") is undefined"
      • 这仅适用于通过 jQuery 的助手绑定的事件。
      • $.data() 在 jQuery >= 1.8 中不再工作。对我来说 $._data() 在 jQuery 1.10.1 中工作。请参阅 Tom Gerken 的回答以获得可行的解决方案。
      猜你喜欢
      • 2011-06-15
      • 2014-02-17
      • 2011-06-03
      • 2021-12-16
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 2012-12-31
      相关资源
      最近更新 更多