jQuery encuentra controladores de eventos registrados con un objeto

Resuelto ages04 asked hace 14 años • 16 respuestas

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?

ages04 avatar Mar 26 '10 01:03 ages04
Aceptado

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" );

elemdebe 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" );
jps avatar Mar 25 '2010 18:03 jps

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>
Expandir fragmento

Nick Craver avatar Mar 25 '2010 20:03 Nick Craver

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").

PhistucK avatar Jul 05 '2012 11:07 PhistucK