【问题标题】:How to Get Event Listener of an Element如何获取元素的事件监听器
【发布时间】:2020-09-16 06:05:45
【问题描述】:

有没有什么方法可以使用该页面上的 JavaScript 获取 HTML 页面上某个元素的所有事件侦听器的列表。

注意:我知道我们可以使用 Chrome 开发工具事件侦听器查看它们,但我想使用页面的 JavaScript 记录/访问查看列表。

另外,我知道我们可以通过 jQuery 获取它们,但为此,我们还必须使用 jQuery 应用事件,但我想要一些通用的东西,因此我还可以访问应用于其他元素(如 web)的事件侦听器组件或反应组件。

【问题讨论】:

  • 嘿,您找到解决问题的方法了吗?

标签: javascript events dom-events


【解决方案1】:

如果你真的必须这样做,一般的方法是修补EventTarget.prototype.addEventListener

const listeners = [];
const orig = EventTarget.prototype.addEventListener;
EventTarget.prototype.addEventListener = function(...args) {
  if (this instanceof HTMLElement) {
    listeners.push({
      type: args[0],
      fn: args[1],
      target: this,
    });
  }
  return orig.apply(this, args);
};

document.body.addEventListener('click', () => console.log('body clicked'));
console.log(listeners[0].fn);
click this body

要查找附加到元素的侦听器,请遍历 listeners 数组并查找与您要查找的元素匹配的 targets。

为了完整起见,还要修补 removeEventListener 以便在删除时可以从数组中删除项目。

如果您需要监视通过on 附加的侦听器,那么您必须执行与上述类似的操作来修补HTMLElement.prototype.onclick getter/setter,以及您希望能够检测到的每个侦听器。

也就是说,虽然你说你想要一个通用的解决方案,而不是修补内置原型,但最好通过 jQuery 或通过你自己的函数添加侦听器。

【讨论】:

  • 但是 OP 还应该实现.removeEventListener()(在需要时)以摆脱存储的处理程序引用。并且使用on 属性定义的处理程序将丢失。
  • 首先,非常感谢您的回答,非常感谢。但实际上我需要一种通用的方法来完成它,因为我正在使用 Web 组件,并且我们正在根据它们自己的方法添加事件,我们实际上并不想修补它们,而是寻找一种获取方法它们在脚本中,因为它们已经可以在 chrome 开发工具上看到。
猜你喜欢
  • 2016-12-26
  • 2021-03-17
  • 2022-01-17
  • 2017-04-16
  • 2010-11-30
  • 2022-12-19
  • 2021-11-21
  • 2014-02-18
  • 1970-01-01
相关资源
最近更新 更多