如何使用Firebug或类似工具调试JavaScript / jQuery事件绑定?

我需要调试一个使用jQuery的Web应用程序来执行一些相当复杂和混乱的DOM操作。在某一时刻,一些绑定到特定元素的事件没有被触发,只是停止工作。

如果我有能力编辑应用程序源代码,我会向下钻取并添加一堆Firebug语句和注释/取消注释代码片段,以尝试查明问题。但是让我们假设我无法编辑应用程序代码,并且需要使用Firebug或类似工具完全在Firefox中工作。console.log()

Firebug非常擅长让我导航和操纵DOM。但是,到目前为止,我还没有弄清楚如何使用Firebug进行事件调试。具体来说,我只想看到在给定时间绑定到特定元素的事件处理程序列表(使用Firebug JavaScript断点来跟踪更改)。但是,要么是Firebug没有能力看到绑定的事件,要么是我太笨了,找不到它。:-)

任何建议或想法?理想情况下,我只想查看和编辑绑定到元素的事件,类似于我今天编辑DOM的方式。


答案 1

请参阅如何在 DOM 节点上查找事件侦听器

简而言之,假设在某个时候将事件处理程序附加到您的元素(例如):$('#foo').click(function() { console.log('clicked!') });

你像这样检查它:

  • 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!') }"
    })
    

请参阅 jQuery.fn.data(其中 jQuery 在内部存储您的处理程序)。

  • 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!') }"
    })
    

答案 2

有一个名为Visual Event的漂亮书签,可以显示附加到元素的所有事件。它具有针对不同类型的事件(鼠标,键盘等)的颜色编码突出显示。当您将鼠标悬停在它们上时,它会显示事件处理程序的正文,它是如何附加的,以及文件/行号(在WebKit和Opera上)。您也可以手动触发事件。

它无法找到每个事件,因为没有标准的方法来查找附加到元素的事件处理程序,但它适用于流行的库,如jQuery,Prototype,MooTools,YUI等。