jQuery encuentra controladores de eventos registrados con un objeto
Necesito encontrar qué controladores de eventos están registrados sobre un objeto.
Por ejemplo:
$("#el").click(function() {...});
$("#el").mouseover(function() {...});
$("#el")
tiene registrado el clic y el paso del mouse .
¿Existe alguna función para descubrirlo y posiblemente iterar sobre los controladores de eventos?
Si no es posible en un objeto jQuery mediante los métodos adecuados, ¿es posible en un objeto DOM simple?
A partir de jQuery 1.8, los datos del evento ya no están disponibles en la "API pública" para datos. Lea esta publicación de blog de jQuery . Ahora deberías usar esto en su lugar:
jQuery._data( elem, "events" );
elem
debe ser un elemento HTML, no un objeto jQuery o un selector.
Tenga en cuenta que esta es una estructura interna y "privada" y no debe modificarse. Utilice esto únicamente con fines de depuración.
En versiones anteriores de jQuery, es posible que tengas que utilizar el método antiguo, que es:
jQuery( elem ).data( "events" );
Puedes hacerlo rastreando los eventos (a partir de jQuery 1.8+), así:
$.each($._data($("#id")[0], "events"), function(i, event) {
// i is the event type, like "click"
$.each(event, function(j, h) {
// h.handler is the function being called
});
});
Aquí tienes un ejemplo con el que puedes jugar:
$(function() {
$("#el").click(function(){ alert("click"); });
$("#el").mouseover(function(){ alert("mouseover"); });
$.each($._data($("#el")[0], "events"), function(i, event) {
output(i);
$.each(event, function(j, h) {
output("- " + h.handler);
});
});
});
function output(text) {
$("#output").html(function(i, h) {
return h + text + "<br />";
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="el">Test</div>
<code>
<span id="output"></span>
</code>
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 marca la diferencia aquí. Internamente, está llamando $.data(element, name, null, true)
, el último (cuarto) parámetro es interno ("pvt").