Necesito encontrar qué controladores de eventos están registrados sobre un objeto.
Por ejemplo:
$("#el").click(function() {...});
$("#el").mouseover(function() {...});
$("#el")
tiene clic y mouseover registrados.
¿Hay una función para descubrir eso y posiblemente iterar sobre los controladores de eventos?
Si no es posible en un objeto jQuery a través de métodos adecuados, ¿es posible en un objeto DOM simple?
var events = (jQuery._data || jQuery.data)(elem, 'events');
Respuestas:
A partir de jQuery 1.8, los datos del evento ya no están disponibles en la "API pública" para los datos. Lea esta publicación de blog jQuery . Ahora deberías usar esto en su lugar:
elem
debe ser un elemento HTML, no un objeto jQuery o selector.Tenga en cuenta que esta es una estructura interna 'privada' y no debe modificarse. Use esto solo para propósitos de depuración.
En versiones anteriores de jQuery, es posible que deba usar el método anterior, que es:
fuente
$._data($(elem).get(0), "events")
handler: function () {
dentro de la propiedad de clic. Tuve que hacer doble clic en la parte de la función para que se expandiera y mostrara el contenido completo de la función.var events = (jQuery._data || jQuery.data)(elem, 'events');
Puede hacerlo rastreando los eventos (a partir de jQuery 1.8+), de esta manera:
Aquí hay un ejemplo con el que puedes jugar:
fuente
jQuery._data( jQuery("#el")[0], "events" );
en lugar del método "datos públicos:jQuery("#el").data("events")
. Elevents
objeto no se ha almacenado.data()
durante mucho tiempo, recortamos algunos bytes de código eliminando este "proxy" de la "API pública"Para jQuery 1.8+, esto ya no funcionará porque los datos internos se colocan en un objeto diferente.
La última forma no oficial (pero también funciona en versiones anteriores, al menos en 1.7.2) de hacerlo ahora es:
$._data(element, "events")
El guión bajo ("_") es lo que hace la diferencia aquí. Internamente, está llamando
$.data(element, name, null, true)
, el último (cuarto) parámetro es interno ("pvt").fuente
jQuery._data( element, "events" )
es la forma 'correcta' de obtener esta información ahora.Enchufe descarado, pero puede usar findHandlerJS
Para usarlo solo debe incluir findHandlersJS (o simplemente copiar y pegar el código JavaScript sin formato en la ventana de la consola de Chrome) y especificar el tipo de evento y un selector jquery para los elementos que le interesan.
Para su ejemplo, puede encontrar rápidamente los controladores de eventos que mencionó haciendo
Esto es lo que se devuelve:
El real donde se registró el controlador de eventos
Matriz con información sobre los controladores de eventos jquery para el tipo de evento que nos interesa (por ejemplo, hacer clic, cambiar, etc.)
Método del manejador de eventos real que puede ver haciendo clic derecho y seleccionando Mostrar definición de función
El selector proporcionado para eventos delegados. Estará vacío para eventos directos.
Lista con los elementos a los que se dirige este controlador de eventos. Por ejemplo, para un controlador de eventos delegado que está registrado en el objeto del documento y se dirige a todos los botones de una página, esta propiedad enumerará todos los botones de la página. Puede desplazarlos y verlos resaltados en cromo.
Puedes probarlo aquí
fuente
Yo uso eventbug plugin para Firebug para este propósito.
fuente
Combiné ambas soluciones de @jps a una función:
Pero cuidado, esta función solo puede devolver eventos que se configuraron usando jQuery.
fuente
A partir de 1.9 no existe una forma documentada de recuperar los eventos, aparte de usar el complemento Migrate para restaurar el comportamiento anterior. Podría usar el método _.data () como menciona jps, pero ese es un método interno. Entonces, haga lo correcto y use el complemento Migrate si necesita esta funcionalidad.
De la documentación de jQuery en
.data("events")
fuente
jQuery._data( elem, "events" );
...Para verificar eventos en un elemento:
Por ejemplo:
o
Ejemplo completo:
Una forma más completa de verificar, que incluye escuchas dinámicos, instalados con $ (documento) .on
Ejemplo de uso:
fuente
getEvents
método es extremadamente bueno, pero lo cierto es que proporciona entradas duplicadas en IE11 (lo sé, IE nuevamente, pero la empresa lo necesita ...). EDITAR: $ ._ datos contiene eventos duplicados para el elemento, aunque en FF no contiene ninguno ... Mundo extraño de IE. Pero es importante tener cuidado con esta posibilidad de tener eventos duplicados.Creé un selector de jQuery personalizado que verifica tanto el caché de jQuery de los controladores de eventos asignados como los elementos que usan el método nativo para agregarlos:
Ejemplo:
Esto devolverá elementos que tienen un controlador de clic adjunto.
fuente
En un navegador moderno con ECMAScript 5.1 /
Array.prototype.map
, también puede usaren la consola de su navegador, que imprimirá la fuente de los controladores, delimitada por comas. Útil para echar un vistazo a lo que se está ejecutando en un evento en particular.
fuente
jQuery._data('ct100_ContentPlaceHolder1_lcsSection','events')["EVENT_NAME"].map(function(elem){return elem.handler;});
Error de tipo no capturado: no se puede leer la propiedad 'EVENT_NAME' de undefined en <anónimo>: 1: 62'ct100_ContentPlaceHolder1_lcsSection'
es una cadena, no un elemento DOM.Los eventos se pueden recuperar usando:
o jQuery 1.8+:
Nota: Los eventos delimitados usando
$('selector').live('event', handler)
se pueden recuperar usando:fuente
Tengo que decir que muchas de las respuestas son interesantes, pero recientemente tuve un problema similar y la solución fue extremadamente simple siguiendo el camino del DOM. Es diferente porque no itera sino que apunta directamente al evento que necesita, pero a continuación le daré una respuesta más general.
Tenía una imagen en una fila:
Y esa imagen tenía un controlador de eventos de clic adjunto:
Mi intención era expandir el área en la que se podía hacer clic a toda la fila, por lo que primero obtuve todas las imágenes y filas relativas:
Ahora, en la línea de respuesta real , acabo de hacer lo siguiente, respondiendo a la pregunta original:
Así que busqué el controlador de eventos directamente desde el elemento DOM y lo puse en el controlador de eventos jQuery click. Funciona de maravilla.
Ahora, al caso general. En los viejos días anteriores a jQuery, se podían conectar todos los eventos a un objeto con dos funciones simples pero poderosas que Douglas Crockford nos regaló a los mortales :
fuente
Pruebe el complemento jquery debugger si está usando Chrome: https://chrome.google.com/webstore/detail/jquery-debugger/dbhhnnnpaeobfddmlalhnehgclcmjimi?hl=en
fuente
Otra forma de hacerlo es usar jQuery para tomar el elemento, luego pasar por Javascript real para obtener, configurar y jugar con los controladores de eventos. Por ejemplo:
fuente
Combiné algunas de las respuestas anteriores y creé este script de aspecto loco pero funcional que, con suerte, enumera a la mayoría de los oyentes de eventos en el elemento dado. Siéntase libre de optimizarlo aquí.
fuente
jQuery no le permite simplemente acceder a los eventos de un elemento determinado. Puede acceder a ellos utilizando un método interno no documentado
Pero todavía no le dará todos los eventos, para ser precisos, no le mostrará los eventos asignados con
Estos eventos se almacenan dentro del documento, por lo que puede buscarlos navegando a través de
pero eso es un trabajo duro, ya que hay eventos para toda la página web.
Tom G creó una función que filtra el documento solo para eventos de un elemento dado y combina la salida de ambos métodos, pero tenía un defecto de duplicar eventos en la salida (y efectivamente en la lista de eventos internos de jQuery del elemento que interfiere con su aplicación). Arreglé esa falla y puedes encontrar el código a continuación. Simplemente péguelo en su consola de desarrollo o en el código de su aplicación y ejecútelo cuando sea necesario para obtener una buena lista de todos los eventos para un elemento dado.
Es importante notar que el elemento es en realidad HTMLElement, no un objeto jQuery.
fuente