检查附加的事件处理程序是否有任何DOM元素


Answers:


71

使用传统element.onclick= handler或HTML 附加的事件处理程序<element onclick="handler">可以element.onclick从脚本或调试器中的属性中轻松检索。

使用DOM Level 2事件addEventListener方法和IE 附加的事件处理程序attachEvent目前根本无法从脚本中检索。DOM Level 3曾经提出element.eventListenerList要获取所有侦听器,但是目前尚不清楚这是否符合最终规范。今天,任何浏览器都没有实现。

作为浏览器扩展的调试工具可以访问这些类型的侦听器,但我不知道实际上有任何侦听器。

一些JS框架留下了足够的事件绑定记录,以计算出它们所做的工作。Visual Event采用这种方法来发现通过一些流行框架注册的侦听器。


7
现在,Firebug有一个名为EventBug的扩展,据说在chrome / safari中具有类似功能。:我也会链接到一个比较流行的讨论这个stackoverflow.com/questions/446892/...
Nickolay

1
在Opera中,您可以使用内置的Opera Dragonfly。
Norill Tempest 2013年

当选择HTML标记时,FireBug(FireFox的扩展名)也有内置部件来处理事件。
Musa Haidari 2014年

从版本2开始,EventBug已集成到FireBug中(现在有一个“事件”标签)。
克里斯·雷


76

自2011年中发布Chrome以来,自2010年以来发布了Chrome开发者渠道,Google Chrome开发者工具中Elements Panel便具有此功能。

同样,为选定节点显示的事件侦听器的顺序是,它们在捕获和冒泡阶段中被触发

命中command+ option+ i在Mac OSX和Ctrl+ Shift+ i在Windows上的Chrome火这件事

开发工具截图


5
Chrome中的Elements面板如何做到这一点?
thunderboltz

1
另外,我们如何找到分配这些代码的代码?一旦我使用此UI找到可疑事件处理程序,该栏的宽度就不足以让我看到处理程序的代码...
Steven Lu

我觉得这种方法相当混乱..至少对我来说。当我打开该事件时,它仅包含jQuery事件,但未显示该特定元素的自定义事件。我将$ ._ data用于与jQuery关联的自定义事件。见stackoverflow.com/questions/2008592/...
stack247

2
是否可以检查window对象上的message事件,例如事件?
2015年

8

Chrome Dev Tools最近宣布了一些用于监视JavaScript事件的新工具。

TL; DR

使用收听特定类型的事件monitorEvents()

使用unmonitorEvents()停止监听。

使用来获取DOM元素的侦听器getEventListeners()

使用“事件侦听器”检查器面板获取有关事件侦听器的信息。

查找自定义事件

对于我的需求,在第3方代码中发现自定义JS事件,以下的两个版本getEventListeners()非常有用。

  • getEventListeners(window)
  • getEventListeners(document)

如果您知道将事件侦听器附加到哪个DOM节点,则将其传递给而不是windowor document

已知事件

如果您知道要监视的事件(例如click在文档正文上),则可以使用以下命令:monitorEvents(document.body, 'click');

现在,您应该开始document.body在控制台中看到正在记录的所有单击事件。


我已经试过thisgetEventListeners(document.getElementById(“ inputId”)); 但它返回无效值,数组大小为1
浓绿色

6

您可以通过查看DOM来查看直接附加的事件(element.onclick =处理程序)。您可以使用带有FireQuery的FireBug在Firefox中查看与jQuery关联的事件。似乎没有任何方法可以使用FireBug查看addEventListener添加的事件。但是,您可以使用Chrome调试器在Chrome中看到它们。


6

您可以使用Allan Jardine的Visual Event来检查页面上几个主要JavaScript库中所有当前附加的事件处理程序。它适用于jQuery,YUI和其他几种。

视觉事件是JavaScript书签,因此与所有主要浏览器兼容。


1

您可以扩展JavaScript环境,以跟踪事件侦听器。用一些代码包装(或“重载”)本地addEventListener()方法,该代码可以保留从那时起添加的任何事件侦听器的记录。您还必须扩展HTMLElement.prototype.removeEventListener,以保留能够准确反映DOM中发生的情况的记录。

仅出于说明目的(未经测试的代码)-这是一个示例,说明如何“包装” addEventListener以在对象本身上具有已注册事件侦听器的记录:

var nativeMethod = HTMLElement.prototype.addEventListener;
HTMLElement.prototype.addEventListener = function (type, listener) {
   var el = e.currentTarget;
   if(!(el.eventListeners instanceof Array)) { el.eventListeners = []}
   el.eventListeners.push({'type':type, 'listener':listener});
   nativeMethod.call(el, type, listener);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.