【问题标题】:Catch any event in the document捕捉文档中的任何事件
【发布时间】:2021-07-18 06:51:56
【问题描述】:

一个页面被营销脚本填满。比如测验、在线聊天、CRM 等。 触发了很多事件:聊天中的对话开始,聊天被提交,iframe 中的表单被提交等等。

只是 CRM 会触发很多事件。阅读文档以搜索必要的事件是一个乏味的过程。对我来说没问题,但现在我想捕获文档中的任何事件并将其打印到控制台。

这既是为了学习目的,也是为了自我控制。

我想要一些可以捕捉文档中任何事件的东西。然后我就可以将它打印到控制台日志中。像这样的:

document.addEventListener(function(event){console.log(event);}

这里的“事件”是指任何事件。

当我直观地看到这些事件并将它们与我在屏幕上看到的内容进行比较时,我会更好更快地研究这些营销库的 API。

【问题讨论】:

标签: javascript


【解决方案1】:

没有快速/好的方法可以做到这一点。

但是,这不是您在生产中应该做的事情,但即使出于测试目的也是值得怀疑的。

这是因为有非常多事件,因为即使是冒泡事件也会在document 结束。全部记录可能会对性能产生影响,并且肯定会导致控制台塞满大量事件。

话虽如此,这里有一些方法可以做到这一点:

  1. 为您感兴趣的事件添加监听器

    创建一些这样的代码:

    const events = ['load', 'click', 'auxclick', 'keyup'] //Add/remove anything to this array 
    
    for(const event of events)
      document.addEventListener(event, console.log)
    

    并添加您感兴趣的任何事件。

  2. 使用浏览器的 DevTools(或其他任何名称)

    现代浏览器的开发人员工具允许监听和中断特定事件(尽管您可以根据需要选择所有事件)。

  3. 滥用on-properties

    EventTargets 通常通过名为on<em>event</em> 的属性公开他们的事件。您可以循环这些并使用它们来添加侦听器。

    for(const property of Object.getOwnPropertyNames(document))
      if(property.startsWith('on'))
        document.addEventListener(property.slice(2), console.log)
    

    但是,即使是这个也会忽略事件(例如,DOMContentLoaded 没有 on-property)

【讨论】:

  • 你能告诉我第 2 点 - 开发工具。你的意思是浏览器已经有我需要的东西了吗?哪个浏览器?我有 FireFox 和 Chrome,但我可以安装任何一个。如果 Chrome 允许这样做,去哪里看?
  • @Trts 我使用 Chrome,它有一个break 事件的功能(不记录它们)。在 Chrome 中,可以在以下位置找到:源选项卡 > 右侧面板 > 事件侦听器断点。有一个分组的、可选择的事件列表。当发出其中一个被勾选的事件时,执行将停止,就像代码遇到断点时一样。 Firefox 也有此功能,请参阅developer.mozilla.org/en-US/docs/Tools/Debugger/…。显然,FF 也可以记录事件而不是中断它们。
猜你喜欢
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
相关资源
最近更新 更多