检查元素上是否存在事件

IT技术 javascript jquery jquery-events eventtrigger
2021-02-02 07:33:07

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

6个回答
$('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') 提供了更多的信息。
2021-03-21 07:33:07
$.data() 在 jQuery >= 1.8 中不再起作用。对我来说 $._data() 在 jQuery 1.10.1 中工作。请参阅 Tom Gerken 的答案以获取可行的解决方案。
2021-03-21 07:33:07
这仅适用于通过 jQuery 的助手绑定的事件。
2021-03-25 07:33:07
为什么不直接使用 $('body').data('events') 呢?
2021-03-29 07:33:07
给我一个错误“$.data($('#myDiv').get(0), “events”) 未定义”
2021-04-01 07:33:07

您可以使用:

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

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

问题是检查元素上是否存在事件,而不是如何解除现有事件的绑定......
2021-03-17 07:33:07
同意:不是对 OP 的严格回答,而是我所需要的;)
2021-03-26 07:33:07
如果您使用 live 注册事件,则无济于事。stackoverflow.com/questions/12755646/...
2021-03-29 07:33:07
@Avi,这仍然是一个很好的答案,因为在很多情况下,在提出问题时都会考虑到这个问题:“如何不注册处理程序两次?”
2021-04-02 07:33:07
如果您不想销毁在其他地方注册的事件,这将不起作用
2021-04-11 07:33:07

要检查元素上的事件:

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])
此解决方案适用于更高版本的 jQuery 1.8.0。非常感谢 Ton Gerken :)
2021-04-04 07:33:07
这应该是公认的答案,它处理动态应用的事件处理程序,即使代码很少。谢谢!
2021-04-07 07:33:07
我认为您可以使用以下方法简化此操作: var eventBound = (events != null);
2021-04-11 07:33:07

使用jquery 事件过滤器

你可以像这样使用它

$("a:Event(click)")
从 1.8 开始,此插件不再有效
2021-03-22 07:33:07
哈,谢谢,在几个月前得到 meder 的回答后构建了那个插件。
2021-04-01 07:33:07
我喜欢这个,发布一个插件 OP 作为他的问题的答案:)
2021-04-07 07:33:07

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

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

您可以使用 each 或 for ex 迭代它。检查验证的长度,如:

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

以为它会帮助某人。:)

在 jQuery >= 1.8 中不再工作。请参阅 Tom Gerken 的答案以获取可行的解决方案。
2021-03-24 07:33:07