如何使用JavaScript列出DOM节点的所有注册事件?

15

我可以为DOM节点添加或删除事件处理程序。是否可能找出给定DOM节点的所有已注册事件处理程序? 我所指的是纯JavaScript,不使用任何框架或工具包,例如jQuery,dojo,Prototype,GWT等。 如果答案是否定的,有没有任何原因? 安全问题吗?


可能是重复的问题:有任何浏览器实现了DOM3 EventListenerList吗? - Nickolay
两年前提出的问题是否与两天前提出的问题重复? - Murali VP
7个回答

10

4

DOM Level 3规定了eventListenerList,但我不知道有任何支持此功能的DOM实现或其他可靠的列出事件侦听器的方法。到目前为止,这似乎是一种疏忽。


2
DOM Level 3 没有定义 eventListenerList(您正在链接到 2002 年的草案)。请参见 https://dev59.com/5Wsz5IYBdhLWcg3wj4ra#7814692。 - Nickolay
@Nickolay 确实很令人失望地看到WG看不到API的用例,但感谢您指出已经被删除。 - TML
请根据“规范”更新此答案。我不得不阅读评论才能[重新]感到失望。 - user2246674

3

以下方法适用于Chrome/Safari的控制台:

getEventListeners(document.getElementByID('myElementId'));

0

Visual Event 可以显示哪些事件已经注册,但它只适用于 DOM Level 0 附加事件;W3C Level 2 实现以及 Internet Explorer 的专有方法不受支持和/或无法检索。


0
如果您想要发现某个事件并禁用它,我建议使用Mozilla Firefox浏览器的Firebug扩展程序。选择您感兴趣的文档部分,查看右侧面板中的“事件”选项卡:您将看到所有事件,并且甚至可以禁用它们。

0
此外,在 Google Chrome 中,请选择元素并注意数字,它会显示$0或其他任何数字。
然后在控制台中输入此代码并按回车键。
getEventListeners($0)

然后你就会看到结果。请参考下面的图片以获得更详细的说明。

Google Console showing getEventListeners result


0

我遇到了同样的问题,来到这里,但没有找到有用的答案。

如果你能在其他方调用 addEventListener 之前执行脚本,你可以做一些非常不好的事情,比如:

var obj = something; // Your DOM element you want to watch

var beforeAddEvent = obj.addEventListener;
obj.addEventListener = function() {
  // Do something with arguments here (like storing in an array)
  // arguments[0]: event name
  // arguments[1]: Listener function
  // arguments[3]: eventual options passed

  // If you don't call this, the event listener won't even be attached, it might be also useful in some case
  beforeAddEvent.apply(obj, arguments);
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接