2010-03-05 21 views
48

Con jQuery puede vincular funciones a un evento desencadenado en un objeto DOM utilizando .bind() o una de las funciones auxiliares del controlador de eventos.Acceso a funciones vinculadas a controladores de eventos con jQuery

jQuery tiene que almacenar esto internamente de alguna manera y me pregunto si es posible dado un objeto DOM, para averiguar qué eventos se han vinculado al objeto, y acceder a esas funciones, etc. El resultado de retorno deseado podría ser algo como esto :

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

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

Respuesta

35

Editar: el método siguiente funciona sólo en jQuery < 1,7

puede encontrar una gran cantidad de consejos y trucos interesantes en este artículo: Things you may not know about jQuery.

Parece que jQuery utiliza data para almacenar controladores de eventos:

puede acceder a todos los controladores de eventos unidos a un elemento (o cualquier objeto) a través del almacenamiento de eventos de 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

Esto ya no funciona en jQuery 1.7 y más reciente; ver la respuesta de Eikes para la nueva forma. – kevingessner

+0

He editado mi respuesta para reflejar esto. Gracias – PatrikAkerstrand

+0

No funciona. Intenté '$ (document) .data ('events')' & '$ ('html'). Data ('events')' - no hay disponibilidad. – Cody

66

jQuery 1.7 ha dejado de exponer los eventos en la función de datos regular(). Todavía se puede conseguir de esta manera:

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

Tenga en cuenta que esto sólo funciona para los eventos que han sido vinculados con jQuery. AFAIK que no hay forma de ver todos los eventos que se han enlazado usando las funciones regulares DOM como addEventListener.

Sin embargo, puedes verlos en el inspector de webkit: en la pestaña Elementos, navega hasta el nodo DOM deseado, en el lado derecho, selecciona el menú desplegable "Escuchas de eventos".

+1

jQuery._data (elem) funciona bien en la versión 1.10.2 – rajakvk

Cuestiones relacionadas