¿Es posible determinar si un elemento tiene un manejador de clic, o un manejador de cambio, o cualquier tipo de manejador de evento vinculado a él usando jQuery?
Además, ¿es posible determinar cuántos manejadores de clic (o cualquier tipo de manejador de evento) tiene para un tipo dado de evento, y qué funciones hay en los manejadores de evento?
Puedes obtener esta información de la caché de datos.
Por ejemplo, regístrelos en la consola (firebug, ie8):
console.dir( $('#someElementId').data('events') );
o iterarlos:
jQuery.each($('#someElementId').data('events'), function(i, event){
jQuery.each(event, function(i, handler){
console.log( handler.toString() );
});
});
Otra forma es que usted puede utilizar el siguiente bookmarklet pero, obviamente, esto no ayuda en tiempo de ejecución.
Escribí un plugin llamado hasEventListener que hace exactamente eso:
http://github.com/sebastien-p/jquery.hasEventListener
Espero que esto ayude.
No creo que el plugin hasEventListener mencionado maneje eventos personalizados, por ejemplo.
var obj = {id:'test'};
$(obj).bind('custom', function(){
alert('custom');
}).trigger('custom');
alert($(obj).hasEventListener('custom'));
Además, al menos en jQuery 1.5 creo que hay que tener cuidado al usar $(target).data('events') porque devuelve de forma diferente para eventos que han sido ligados a objetos como arriba.
Tienes que hacer algo como
var events = $(target).data("events");
if(typeof events === "function"){
events = events.events;
}
¡Estoy utilizando este tipo de enfoque y funciona, pero se siente un poco como si estuviera a merced de jquery internos y que realmente no debería estar haciendo!