prova se il gestore di eventi è associato a un elemento in jQuery

È ansible determinare se un elemento ha un gestore di clic, un gestore di modifiche o qualsiasi tipo di gestore di eventi associato ad esso utilizzando jQuery?

Inoltre, è ansible determinare quanti gestori di clic (o qualsiasi tipo di gestore di eventi) ha per un determinato tipo di evento e quali funzioni sono presenti nei gestori di eventi?

puoi ottenere queste informazioni dalla cache dei dati.

// registrali alla console (firebug, ie8)

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

// o iterali

 jQuery.each($('#someElementId').data('events'), function(i, event){ jQuery.each(event, function(i, handler){ console.log( handler.toString() ); }); }); 

Un altro modo è ansible utilizzare il seguente bookmarklet, ma ovviamente questo non aiuta in fase di runtime.

Uccidere il legame quando non esiste ancora non è la soluzione migliore ma sembra abbastanza efficace! La seconda volta che fai clic su “puoi sapere con certezza che non creerà una doppia associazione”.

Quindi uso die () o unbind () in questo modo:

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

o

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

o nelle recenti versioni di jQuery:

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

Ho scritto un plugin chiamato hasEventListener che lo fa esattamente:

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

Spero che questo ti aiuti.

Questa soluzione non è più supportata da jQuery 1.8, come possiamo leggere sul blog qui:

$ (elemento) .data (“eventi”): ora viene rimosso in 1.8, ma è comunque ansible accedere ai dati degli eventi per scopi di debug tramite $ ._ dati (elemento, “eventi”). Si noti che questa non è un’interfaccia pubblica supportata; le strutture dati effettive potrebbero cambiare in modo incompatibile da versione a versione.

Quindi, dovresti separarlo / riassociarlo o semplicemente, usare un booleano per determinare se il tuo evento è stato allegato o meno (che è secondo me la soluzione migliore).

Penso che questo potrebbe essere aggiornato con jQuery 1.9. *

Sto scoprendo che questa è l’unica cosa che funziona per me al momento:

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

Ho scritto un plugin molto piccolo chiamato “once” che lo fa:

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

E semplicemente:

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

Per jQuery 1.9+

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

Avevo bisogno del letterale [0] array.

Non penso che il plugin hasEventListener menzionato gestirà eventi personalizzati ad es

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

Inoltre, almeno in jQuery 1.5, penso che sia necessario fare attenzione a usare $ (target) .data (‘eventi’) perché restituisce in modo diverso per eventi che sono stati associati a oggetti come sopra.

Devi fare qualcosa come:

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

Sto usando questo tipo di approccio e funziona, ma mi sento un po ‘come se fossi alla mercé di jquery internals e che davvero non dovrei farlo!

Ho avuto lo stesso bisogno e ho rapidamente aggiornato un codice esistente per poter fare qualcosa del genere:

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

Funziona anche per la delega degli eventi:

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

È disponibile qui: jquery-handler-toolkit.js

Con riferimento alla risposta di SJG e da W3Schools.com

A partire da jQuery versione 1.7, il metodo off () è il nuovo sostituto per i metodi unbind (), die () e undelegate (). Questo metodo apporta molta coerenza all’API e ti consigliamo di utilizzare questo metodo, in quanto semplifica la base del codice jQuery.

Questo da:

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

o

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

Funziona per me: $ (‘# profile1’). Attr (‘onclick’)