testați dacă event handler este legat la un element în jQuery

Este posibil pentru a determina dacă un element are un handler click, sau o schimbare handler, sau orice fel de tratare a evenimentului legat la acesta folosind jQuery?

În plus, este posibil să se determine cât de multe click stivuitoare (sau orice fel de event handlers) are pentru un anumit tip de eveniment, și ce funcții sunt în stivuitoare eveniment?

Soluția

Puteți obține aceste informații de la cache-ul de date.

De exemplu, să le conectați la consola (firebug, ie8):

console.dir( $('#someElementId').data('events') );

sau repeta-le:

jQuery.each($('#someElementId').data('events'), function(i, event){

    jQuery.each(event, function(i, handler){

        console.log( handler.toString() );

    });

});

O altă modalitate este, puteți utiliza următoarele bookmarklet, dar, evident, acest lucru nu ajuta la runtime.

Comentarii (21)

Uciderea în afara obligatoriu atunci când aceasta nu există încă nu este cea mai bună soluție, dar pare destul de eficient! A doua oară când "clic", puteți ști cu certitudine că aceasta nu va crea un duplicat obligatorii.

Prin urmare, utilizarea die() sau desface() astfel:

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

sau

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

sau în ultimii versiuni jQuery:

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

Am scris un plugin numit hasEventListener care face exact asta :

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

Sper că acest lucru vă ajută.

Comentarii (5)

Această soluție nu mai este susținută de jQuery 1.8 după cum putem citi pe blog aici:

$(element).date("evenimente"): Aceasta este acum scos la 1.8, dar puteți obține în continuare la date de evenimente pentru scopuri de depanare, prin intermediul $._data(element, "evenimente"). Rețineți că acesta nu este un public susținut de interfață; datele reale structuri pot schimba incompatibly de la versiune la versiune.

Deci, ar trebui să dezlegi/rebind sau pur și simplu, utilizați un boolean pentru a determina dacă evenimentul dvs. ca fost atașat sau nu (care este, în opinia mea, cea mai bună soluție).

Comentarii (5)

Cred că acest lucru ar putea fi actualizat cu jQuery 1.9.*

Am'm găsirea acesta este singurul lucru care funcționează pentru mine în acest moment:

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

Am scris un mic plugin numit "o dată" care face asta:

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

Și pur și simplu:

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

Pentru jQuery 1.9+

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

Am nevoie de [0] serie literal.

Comentarii (0)

Eu nu't cred că hasEventListener plugin menționat se va ocupa de evenimente personalizate, de exemplu

var obj = {id:'test'};
$(obj).bind('custom', function(){
    alert('custom');
}).trigger('custom');

alert($(obj).hasEventListener('custom'));

De asemenea, cel puțin în jQuery 1.5 cred că trebuie să fii atent, folosind $(țintă).date de('evenimente'), pentru că acesta revine în mod diferit pentru evenimente care au fost expecteded la obiecte ca mai sus.

Aveți nevoie pentru a face ceva de genul:

var events = $(target).data("events");
if(typeof events === "function"){
   events = events.events;
}

Eu sunt, folosind acest tip de abordare și funcționează, dar se simte un pic ca sunt la mila de jquery interne și că într-adevăr nu ar trebui't face!

Comentarii (0)

Am avut aceeași nevoie & rapid patch-uri un cod existent pentru a fi capabil de a face ceva de genul asta:

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

Acesta funcționează pentru eveniment delegația prea:

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

Acesta este disponibil aici : jquery-handler-toolkit.js

Comentarii (0)

Cu referire la SJG's a răspunde și de la W3Schools.com

Ca de jQuery versiunea 1.7, off() metoda este noul înlocuitor pentru unbind(), die() și undelegate() metode. Această metodă aduce o mulțime de consistență API, și vă recomandăm să utilizați această metodă, deoarece simplifică jQuery cod de bază.

Acest lucru vă oferă:

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

sau

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

Aceasta funcționează și pentru mine: $('#profile1').attr('onclick')

Comentarii (1)