有没有办法用Javascript查找元素的事件处理程序?

Cli*_*ote 11 javascript debugging jquery event-handling javascript-events

说你有这个div:

<div id="foo">bar</div>
Run Code Online (Sandbox Code Playgroud)

你这样做:

$("#foo").click(someFunction);
Run Code Online (Sandbox Code Playgroud)

你的javascript代码里面的某个地方.

一旦加载了页面,有没有办法通过firebug或者检查chrome中的元素或其他任何东西,找出#foo的click事件被绑定someFunction?即,找到这个而不必查看所有代码?

Col*_*der 14

Chrome Developer工具可以做到这一点.

  1. 右键单击一个元素
  2. 单击检查元素
  3. 在右侧列中,向下滚动到事件侦听器

这将为您提供对象上的事件侦听器列表,可以对其进行扩展以查找其源和附加函数.

Firebug在DOM选项卡下有这些信息,但用户不太友好.

  • 当我查看click处理程序时,它只是指向jQuery源代码.我是否应该看到其他内容,它显示我在我的源代码中使用jQuery来定义事件处理程序? (5认同)
  • 虽然这是正确的,但这只允许您查看处理事件的jQuery包装器方法.使用断点从那里导航到实际的事件处理程序是非常棘手的.ruidfigueiredo编写了一些js,可以帮助您轻松找到实际的事件处理程序.请在此处查看:https://github.com/ruidfigueiredo/findHandlersJS您可以将findEventHandlers.js中的代码直接粘贴到控制台中.无需创建实际包含. (3认同)

Nop*_*ope 6

您可以在浏览器内置的开发人员工具中使用控制台.它们内置于IE和Chrome,而FF则需要安装Firebug AddOn.我不知道其他浏览器.

使用调试器控制台,您可以使用jQuery data("events")查询元素的附加事件.此外,这些控制台还可让您动态深入了解您感兴趣的事件的任何其他详细信息.

$("#foo").data("events");
Run Code Online (Sandbox Code Playgroud)

在控制台中执行上述操作将显示一个对象,该对象具有找到的每个事件的属性.在您的示例中,它返回一个对象,其click属性为array,用于存储所有单击事件.

如果您有单击事件并且只想要该对象,则可以在控制台中执行以下操作:

$("#foo").data("events").click;
Run Code Online (Sandbox Code Playgroud)

每个事件对象都有一个handler属性,它将显示它们绑定的函数:

Object
data: null
guid: 2
handler: function mytestFunction(){
arguments: null
caller: null
guid: 2
length: 0
name: "mytestFunction"
prototype: mytestFunction
__proto__: function Empty() {}
namespace: ""
origType: "click"
quick: null
selector: null
type: "click"
__proto__: Object
Run Code Online (Sandbox Code Playgroud)

请参阅DEMO,了解如何在控制台中查询和显示对象.

或者,您也可以使用"处理程序"作为整体摘要对象:

$("#foo").data("handlers");
Run Code Online (Sandbox Code Playgroud)

请注意,虽然这.data("events/handlers")不包括嵌入在html中的任何有线事件,例如:

<div id="foo" onclick="...">bar</div>
Run Code Online (Sandbox Code Playgroud)

有关详细信息data(),请参阅文档