我有一个页面,其中一些事件侦听器附加到输入框和选择框 . 有没有办法找出哪些事件监听器正在观察特定的DOM节点以及哪些事件?
事件附件使用:
-
Prototype's
Event.observe
; -
DOM的
addEventListener
; -
作为元素属性
element.onclick
.
我有一个页面,其中一些事件侦听器附加到输入框和选择框 . 有没有办法找出哪些事件监听器正在观察特定的DOM节点以及哪些事件?
事件附件使用:
Prototype's Event.observe
;
DOM的 addEventListener
;
作为元素属性 element.onclick
.
17 回答
我最近在处理事件,想要查看/控制页面中的所有事件 . 看了可能的解决方案之后,我决定采用自己的方式创建一个自定义系统来监控事件 . 所以,我做了三件事 .
首先,我需要一个容器用于页面中的所有事件监听器:这是
EventListeners
对象 . 它有三个有用的方法:add()
,remove()
和get()
.接下来,我创建了一个
EventListener
对象来保存事件的必要信息,即:target
,type
,callback
,options
,useCapture
,wantsUntrusted
,并添加了一个方法remove()
来删除侦听器 .最后,我扩展了原生
addEventListener()
和removeEventListener()
方法,使它们可以处理我创建的对象(EventListener
和EventListeners
) .用法:
addEventListener()
创建一个EventListener
对象,将其添加到EventListeners
并返回EventListener
对象,以便稍后删除它 .EventListeners.get()
可用于查看页面中的侦听器 . 它接受EventTarget
或字符串(事件类型) .Demo
假设我们想知道当前页面中的每个事件监听器 . 我们可以这样做(假设你使用脚本管理器扩展,在这种情况下是Tampermonkey) . 以下脚本执行此操作:
当我们列出所有听众时,它说有299个事件监听器 . “似乎”有些重复,但我不知道它们是否真的重复 . 并非每个事件类型都是重复的,因此所有这些“重复”都可能是一个单独的监听器 .
代码可以在我的repository.找到,我没有't want to post it here because it' s相当长 .
Update: 这似乎不适用于jQuery . 当我检查EventListener时,我看到回调是
我相信这属于jQuery,并不是真正的回调 . jQuery将实际回调存储在EventTarget的属性中:
要删除事件侦听器,需要将实际回调传递给
removeEventListener()
方法 . 所以为了使这个工作与jQuery,它需要进一步修改 . 我可能会在将来解决这个问题 .(重写this question的答案,因为它与此相关 . )
调试时,如果你只是想看事件,我建议......
Visual Event
Chrome开发人员工具的“元素”部分:选择一个元素并在右下角查找"Event Listeners"(在Firefox中类似)
如果要在代码中使用事件,并且在1.8版之前使用jQuery,则可以使用:
得到事件 . As of version 1.8, using .data("events") is discontinued (见this bug ticket) . 您可以使用:
另一个示例:将特定链接上的所有点击事件写入控制台:
(有关工作示例,请参阅http://jsfiddle.net/HmsQC/)
不幸的是, using $._data this is not recommended 除了调试,因为它是一个内部jQuery结构,并且可能在将来的版本中发生变化 . 不幸的是,我知道没有其他简单的方法可以访问这些事件 .
Chrome,Firefox,Vivaldi和Safari在其开发人员工具控制台中支持
getEventListeners(domElement)
.对于大多数调试目的,可以使用它 .
以下是使用它的非常好的参考:https://developers.google.com/chrome-developer-tools/docs/commandline-api#geteventlistenersobject
我试图在jQuery 2.1中这样做,并使用“
$().click() -> $(element).data("events").click;
”方法它不起作用 .我意识到只有$ ._ data()函数适用于我的情况:
Chrome或Safari浏览器中的WebKit Inspector现在可以执行此操作 . 当您在“元素”窗格中选择DOM元素时,它将显示DOM元素的事件侦听器 .
1:
Prototype.observe
使用Element.addEventListener(参见the source code)2:您可以覆盖
Element.addEventListener
以记住添加的侦听器(方便的属性EventListenerList
已从DOM3规范提案中删除) . 在附加任何事件之前运行此代码:阅读所有活动:
并且不要忘记覆盖
Element.removeEventListener
以从自定义Element.eventListenerList
中删除该事件 .3:
Element.onclick
属性需要特别注意:4:不要忘记
Element.onclick
内容属性:这是两个不同的东西:所以你也需要处理它:
Visual Event bookmarklet(在最流行的答案中提到)只窃取自定义库处理程序缓存:
元素重写可能有问题(即因为有一些DOM特定功能,如实时集合,无法在JS中编码),但它本身提供了eventListenerList支持,它可以在Chrome,Firefox和Opera中运行(在IE7中不起作用) ) .
这取决于事件的附加方式 . 为了说明,我们有以下点击处理程序:
我们将使用不同的方法将它附加到我们的元素,一些允许检查,一些不允许 .
方法A)单个事件处理程序
方法B)多个事件处理程序
方法C):jQuery
(参见jQuery.fn.data和jQuery.data)
方法D):原型(凌乱)
基于answer by Jan Turon的完全工作解决方案 - 从控制台的行为类似
getEventListeners()
:(有一个重复的小错误 . 无论如何它都没有破坏 . )
用法:
someElement.getEventListeners([name])
- 返回事件侦听器列表,如果设置了name,则返回该事件的侦听器数组someElement.clearEventListeners([name])
- 删除所有事件侦听器,如果设置了name,则只删除该事件的侦听器在 Google Chrome 中使用getEventListeners:
原型1.7.1方式
Firefox开发人员工具现在就这样做了 . 通过单击每个元素显示右侧的"ev"按钮显示事件,包括jQuery和DOM事件 .
如果你有Firebug,你可以使用
console.dir(object or array)
在任何JavaScript标量,数组或对象的控制台日志中打印一个漂亮的树 .尝试:
要么
It is possible to list all event listeners 在JavaScript中:并不难;你只需要破解
prototype
的HTML元素方法(在添加监听器之前) .现在每个锚元素(
a
)都将包含一个包含所有侦听器的lastListenerInfo
属性 . 它甚至可以用于删除具有匿名功能的侦听器 .Opera 12(不是最新的Chrome Webkit引擎)Dragonfly已经有一段时间了,显然在DOM结构中显示 . 在我看来,它是一个优秀的调试器,是我仍然使用基于Opera 12的版本的唯一原因(没有v13,v14版本和基于v15 Webkit仍然缺乏Dragonfly)
有好 jQuery Events extension :
(主题source)
如果您只需要检查页面上发生的情况,可以尝试使用Visual Event bookmarklet .
Update :Visual Event 2可用;
您可以通过将其放在
<head>
的顶部来包装用于管理事件侦听器的本机DOM方法:H / T @ les2