¿Cómo depurar enlaces de eventos de JavaScript/jQuery con Firebug o herramientas similares?

Resuelto Jaanus asked hace 15 años • 15 respuestas

Necesito depurar una aplicación web que usa jQuery para hacer un DOM bastante complejo y desordenado. bastante compleja y desordenada . En un momento dado, algunos de los eventos que estaban ligados a elementos particulares, no se activan y simplemente dejan de funcionar.

Si tuviera la capacidad de editar el código fuente de la aplicación, profundizaría y agregaría un montón de Firebug. console.log() y comentaría o descomentaría fragmentos de código para intentar identificar el problema. Pero supongamos que no puedo editar el código de la aplicación y necesito trabajar completamente en Firefox usando Firebug o herramientas similares.

Firebug es muy bueno al permitirme navegar y manipular el DOM. Sin embargo, hasta ahora no he podido descubrir cómo realizar la depuración de eventos con Firebug. Específicamente, solo quiero ver una lista de controladores de eventos vinculados a un elemento particular en un momento dado (usando puntos de interrupción de Firebug JavaScript para rastrear los cambios). Pero o Firebug no tiene la capacidad de ver eventos vinculados o soy demasiado tonto para encontrarlo. :-)

¿Alguna recomendación o idea? Idealmente, solo me gustaría ver y editar eventos vinculados a elementos, de manera similar a como puedo editar DOM hoy.

Jaanus avatar Feb 21 '09 02:02 Jaanus
Aceptado

Ver Cómo encontrar detectores de eventos en un nodo DOM .

En pocas palabras, suponiendo que en algún momento se adjunta un controlador de eventos a su elemento (por ejemplo):$('#foo').click(function() { console.log('clicked!') });

Lo inspeccionas así:

  • jQuery 1.3.x

    var clickEvents = $('#foo').data("events").click;
    jQuery.each(clickEvents, function(key, value) {
      console.log(value) // prints "function() { console.log('clicked!') }"
    })
    
  • jQuery 1.4.x

    var clickEvents = $('#foo').data("events").click;
    jQuery.each(clickEvents, function(key, handlerObj) {
      console.log(handlerObj.handler) // prints "function() { console.log('clicked!') }"
    })
    

Consulte jQuery.fn.data(donde jQuery almacena su controlador internamente).

  • jQuery 1.8.x

    var clickEvents = $._data($('#foo')[0], "events").click;
    jQuery.each(clickEvents, function(key, handlerObj) {
      console.log(handlerObj.handler) // prints "function() { console.log('clicked!') }"
    })
    
Crescent Fresh avatar Feb 20 '2009 20:02 Crescent Fresh

Hay un bonito marcador llamado Visual Event que puede mostrarle todos los eventos adjuntos a un elemento. Tiene resaltados codificados por colores para diferentes tipos de eventos (ratón, teclado, etc.). Cuando pasa el cursor sobre ellos, muestra el cuerpo del controlador de eventos, cómo se adjuntó y el número de archivo/línea (en WebKit y Opera). También puede activar el evento manualmente.

No puede encontrar todos los eventos porque no existe una forma estándar de buscar qué controladores de eventos están adjuntos a un elemento, pero funciona con bibliotecas populares como jQuery, Prototype, MooTools, YUI, etc.

Matthew Crumley avatar Feb 20 '2009 19:02 Matthew Crumley