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?
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.
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(){...
Am scris un plugin numit hasEventListener care face exact asta :
http://github.com/sebastien-p/jquery.hasEventListener
Sper că acest lucru vă ajută.
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).
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!
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
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(){...