2010-03-05 16 views
48

Con jQuery è possibile associare le funzioni a un evento attivato su un oggetto DOM utilizzando .bind() o una delle funzioni helper del gestore eventi.Accesso alle funzioni associate ai gestori di eventi con jQuery

jQuery deve memorizzare questo internamente in qualche modo e mi chiedo se è possibile dato un oggetto DOM, per scoprire quali eventi sono stati associati all'oggetto, e accedere a tali funzioni, ecc. Il risultato di ritorno desiderato potrebbe essere simile a questo :

{ 
    click: [function1, function2], 
    change: [function3], 
    blur: [function4, function5, function6] 
} 
+0

Vedere questa domanda: http://stackoverflow.com/questions/2382994/how-to-check-if-any-javascript-event-listeners-handlers-attached-to-an-element-do – Pointy

risposta

35

Edit: il seguente metodo funziona solo in jQuery < 1,7

È possibile trovare un sacco di consigli e trucchi interessanti in questo articolo: Things you may not know about jQuery.

Sembra che jQuery utilizza data per memorizzare i gestori di eventi:

È possibile accedere a tutti i gestori di eventi legati ad un elemento (o qualsiasi altro oggetto) attraverso la memorizzazione eventi di jQuery:

// List bound events: 
console.dir(jQuery('#elem').data('events')); 

// Log ALL handlers for ALL events: 
jQuery.each($('#elem').data('events'), function(i, event){ 
    jQuery.each(event, function(i, handler){ 
     console.log(handler['handler'].toString()); 
    }); 
}); 

// You can see the actual functions which will occur 
// on certain events; great for debugging! 
+7

Questo non è più funziona in jQuery 1.7 e successivi; vedi la risposta di eikes per il nuovo modo. – kevingessner

+0

Ho modificato la mia risposta per riflettere questo. Grazie – PatrikAkerstrand

+0

Non funziona. Ho provato '$ (document) .data ('events')' & '$ ('html'). Data ('events')' - inutile. – Cody

66

jQuery 1.7 ha interrotto l'esposizione degli eventi nella normale funzione data(). È ancora possibile ottenere loro in questo modo:

var elem = $('#someid')[0]; 
var data = jQuery.hasData(elem) && jQuery._data(elem); 
console.log(data.events); 

Si prega di notare, che questo funziona solo per gli eventi che sono stati legati utilizzando jQuery. AFAIK tu non c'è modo di vedere tutti gli eventi che sono stati associati usando le normali funzioni DOM come addEventListener.

Tuttavia, è possibile visualizzarli nella finestra di ispezione di Webkit: nella scheda Elementi, accedere al nodo DOM desiderato, sul lato destro selezionare il menu a discesa "Ascoltatori di eventi".

+1

jQuery._data (elem) funzionante bene nella versione 1.10.2 – rajakvk

Problemi correlati