web-dev-qa-db-fra.com

Vérifier si l'événement existe sur l'élément

Existe-t-il un moyen de vérifier si un événement existe dans jQuery? Je travaille sur un plug-in qui utilise des événements d'espacement de nom personnalisés et j'aimerais pouvoir vérifier si l'événement est lié à un élément ou non.

175
Corey Hart
$('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
});

Vous pouvez inspecter en alimentant la référence d'objet (pas l'objet jQuery cependant) à $ .data, et pour le deuxième argument, alimentez des événements qui renverront un objet contenant tous les événements tels que 'click'. Vous pouvez parcourir cet objet et voir ce que fait le gestionnaire d'événements.

141
meder omuraliev

Vous pouvez utiliser:

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

pour vous assurer que tous les événements de clic sont non liés, puis attachez votre événement

75
Toni

Pour rechercher des événements sur un élément:

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

Notez que cela ne fonctionnera qu'avec les gestionnaires d’événements directs, si vous utilisez $ (document) .on ("nom-événement", "sélecteur jq", fonction () {// logique}), vous voudrez voir le getEvents fonctionne au bas de cette réponse

Par exemple:

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

ou

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

Exemple complet:

<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>

n moyen plus complet de vérifier, incluant les écouteurs dynamiques, installé avec $ (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;
}

Exemple d'utilisation:

getEvents($('#myElemId')[0])
38
Tom G

use filtre d'événements jquery

vous pouvez l'utiliser comme ça

$("a:Event(click)")
25
Fareed Alnamrouti

J'ai écrit un plugin appelé hasEventListener qui fait exactement cela.

J'espère que cela t'aides.

5
Sebastien P.

Le code ci-dessous vous fournira tous les événements de clic sur un sélecteur donné:

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

Vous pouvez le parcourir en utilisant chacun ou par ex. vérifier la longueur pour la validation comme:

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

Je pensais que cela aiderait quelqu'un. :)

3
rohtakdev

J'ai répondu à une question similaire ici: helper hasHandlers ()

Travailler avec jQuery> = v1.11.0

1
Nadir

Ce travail pour moi montre les objets et le type d'événement qui s'est produit.

    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
    });
0
Jagtar Singh