检查元素上是否存在事件

Cor*_*art 178 javascript jquery javascript-events event-triggers

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

med*_*iev 142

$('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
});
Run Code Online (Sandbox Code Playgroud)

您可以通过将对象引用(不是jQuery对象)提供给$ .data进行检查,对于第二个参数提要'events'进行检查,这将返回填充了所有事件(如"click")的对象.您可以遍历该对象并查看事件处理程序的功能.

  • $ .data()在jQuery> = 1.8中不再起作用.对我来说,$ ._ data()正在使用jQuery 1.10.1.请参阅Tom Gerken的答案以获得有效的解决方案. (19认同)
  • 你为什么不用$('body').data('events')? (17认同)
  • 这仅适用于通过jQuery帮助程序绑定的事件. (7认同)
  • 我实际上更喜欢你的第一个例子,$ .data(elem,'events')提供更多信息. (3认同)
  • 给我一个错误"$ .data($('#myDiv').get(0),"events")未定义" (2认同)
  • 我认为[这个](http://stackoverflow.com/questions/14072042/how-to-check-if-element-has-click-handler/14072162#14072162)是最简单,最笨拙且易于理解的方式检查单个元素**是否有事件**. (2认同)

小智 78

你可以使用:

$("#foo").unbind('click');
Run Code Online (Sandbox Code Playgroud)

要确保所有点击事件都已解除绑定,请附加您的活动

  • @Avi,它仍然是一个很好的答案,因为在许多情况下,问题是问题:"如何不两次注册处理程序?" (42认同)
  • 问题是检查元素上是否存在事件,而不是如何取消绑定现有事件... (27认同)
  • 同意:不是OP的严格答案,而是我所需要的;) (4认同)

Tom*_*m G 39

要检查元素上的事件:

var events = $._data(element, "events")
Run Code Online (Sandbox Code Playgroud)

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

例如:

 var events = $._data(document.getElementById("myElemId"), "events")
Run Code Online (Sandbox Code Playgroud)

要么

 var events = $._data($("#myElemId")[0], "events")
Run Code Online (Sandbox Code Playgroud)

完整示例:

<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>
Run Code Online (Sandbox Code Playgroud)

一种更完整的检查方式,包括使用$(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;
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

getEvents($('#myElemId')[0])
Run Code Online (Sandbox Code Playgroud)


Far*_*uti 26

使用jquery事件过滤器

你可以像这样使用它

$("a:Event(click)")
Run Code Online (Sandbox Code Playgroud)

  • 哈,谢谢,几个月前得到了meder的答案之后构建了这个插件. (33认同)
  • 从1.8开始,这个插件不再有效 (20认同)
  • 我喜欢这个,发布一个插件OP作为他的问题的答案创建:) (7认同)

小智 5

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

希望这可以帮助.


roh*_*dev 5

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

jQuery(selector).data('events').click
Run Code Online (Sandbox Code Playgroud)

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

jQuery(selector).data('events').click.length
Run Code Online (Sandbox Code Playgroud)

认为这会对某人有所帮助。:)

  • 在 jQuery &gt;= 1.8 中不再工作。请参阅 Tom Gerken 的回答以获取可行的解决方案。 (3认同)