【问题标题】:Inspect an element to investigate jQuery event bindings检查元素以调查 jQuery 事件绑定
【发布时间】:2017-03-20 18:56:34
【问题描述】:

假设:我发现一个带有按钮 ('#bigButton') 的页面,当单击该按钮时,会使用 jQuery 显示 () 美洲驼 ('img#theLlama')。

所以,buttons.js 中的某处(比如第 76 行):

$('#bigButton').click(function(){
$('img#theLlama').show();
})

现在,假设我有一个包含大量 .js 文件的大 HTML 页面。我可以点击按钮,看到美洲驼出现,但我不知道上面的代码在哪里。

我正在寻找的解决方案与 Firebug 中的 CSS 提供的解决方案非常相似。我想检查元素并让它告诉我这个 jQuery 出现在buttons.js 的第 76 行,以及这个元素上的任何其他绑定。

*注意:赏金是针对“美洲驼问题”的特定答案,即指向上述解决方案。 *

FireQuery 是许多 jQuery 任务的绝佳工具,但它似乎无法回答 llama 问题。如果我对此有错误,请纠正我。

【问题讨论】:

  • 一个完整的例子将有助于澄清问题,尤其是。因为“此元素的事件绑定”不是标准术语。我认为您的意思是“在哪里调用 element.addEventListener()?
  • 我希望我刚刚添加的细节能让我的问题更清楚。感谢您的建议。

标签: javascript jquery events firebug onclick


【解决方案1】:

使用FirebugFireQuerythis fiddle

点击 Cmd+Shift+C(检查元素)并点击按钮会显示:

点击事件Object {click= } 显示这一点(展开一些信息后)

点击function() 会显示:

应该是您要查找的代码,对吧?

请注意,Firebug 并不总能找到某样东西的确切代码行。我已经让这种方法完全失败了!另一种方法是使用命名函数表达式。将代码更改为:

$('#bigButton').click(function showMyLlama(){
  $('img#theLlama').show();
})

现在在检查 events 对象时会显示这一点:

这比function() 更有用,因为现在很明显,这个处理程序向我们展示了一只美洲驼。您现在也可以搜索函数名称的代码并找到它!


使用Chrome,其内置的网络检查器和this fiddle

点击 Cmd+Shift+C(检查元素)并单击按钮显示如下:

单击元素检查器中的按钮,然后按 Escape 打开 JS 控制台:

在 Chrome 控制台中,$0 指的是元素面板中的选定元素。

输入$._data( $0 ) 将为我们提供包含事件的 jQuery(内部)数据对象,就像在我们的 Firebug 示例中一样,遗憾的是,Chrome 不会让我们点击该功能,但它会让我们看到源代码:

<Broken Screenshot link>


关于.live() 事件的说明:

实时事件存储在$._data( document, "events" ) 上并包含指向函数的origHandler

<Broken screenshot link>

【讨论】:

  • 太棒了。我在 StackOverflow 上见过的最好的答案。你赢了。
  • 我不知道您可以在处理程序中使用和定义命名函数。谢谢!
  • 现在在 chrome 中,您可以右键单击上面找到的 function(),它会为您提供“显示函数定义”选项,它将显示源文件中的函数。
  • @ChristopherWill - 如今,$( elem ).data( "events" ) 是一种已弃用的获取事件处理程序的方法。 jQuery._data( elem ) 是 jQuery 存储其“内部”数据的地方更容易查看,$.fn.data 方法不再是存储事件的地方。
  • 感谢您的解决方案!我不得不使用 $($0).data('events') 即使它已被弃用,因为其他选项不起作用。
【解决方案2】:

鉴于你所追求的界面,我想你会想要 FireQuery:http://firequery.binaryage.com/

这是一个 Firebug 插件专门用于这样的领域(一个 jQuery 特定插件,强大的数据/事件)。

【讨论】:

  • 漂亮的插件!让我补充一下,Firebugs 在 JS 代码中设置断点的能力有助于调试这类事情。
  • 是的,FireQuery 非常棒,并且已经在我的工具箱中。但是,它似乎没有回答骆驼的问题。还是有但我没看到?
  • @Justin - 您可以在#bigButton 上看到该事件并查看它的处理程序代码...但是您将无法看到它大多数时候绑定的位置,因为它可能会有所不同相当多。或者,转到控制台:$("#bigButton").data("events") 查看所有处理程序,控制台界面使导航对象变得非常容易。
  • @Nick Craver:这就是我的怀疑。这让我想到了最后一点:使用 onClick 属性不是更好吗(至少在这方面)?
  • @Justin - 可能有 20 个处理程序,在 20 个地方绑定,绑定,未绑定反弹,可能绑定到气泡外的父级,如果它是基于变量的,如果它是 .live() 没有点击处理程序?是用户触发事件还是模拟事件?这里有很多变量,你必须记住 JavaScript 引擎跟踪代码以使其更快,而不是更容易调试......浏览器希望尽快绑定事件处理程序以击败另一个人,不要让事件更容易追踪,这本来就更重。
【解决方案3】:

FireQuery是最方便的,但是如果需要手动做,可以用$(element).data('events').click[0].handler获取点击处理函数的引用(当然如果有多个点击处理函数也不一定是0)。从那里,您最喜欢的调试器可以在代码中找到该函数。 (使用命名函数会有所帮助。Firebug 有时可以定位匿名函数,但更多情况下不能。不过,如果您将鼠标悬停在函数上方,它会显示函数的主体。)

更新这就是 FireQuery 显示数据的方式:

HTML 视图:

控制台:

【讨论】:

  • 当然,由于事件冒泡的奇妙之处,点击按钮可以激活任何父元素上的事件处理程序。如果其中有很多,那么 Firebug 的分析就是您的朋友。
  • 但是 FireQuery 不允许我直接回答 llama 的问题,对吧?我看不到在 FireQuery 中的哪个位置可以检查元素并查看绑定了哪些事件。
  • @Justin Myles Holmes:在 HTML 视图中,会显示每个节点绑定了哪些数据;您可以在 DOM 视图中检查绑定为“事件”的对象并查看其处理程序属性。控制台还显示是否有与记录的 jQuery 对象相关联的数据,在右括号前带有小信封(?)图标。查看我添加到答案中的图片。
  • 我看到了“events=Object{ click = }”——但我需要确切知道 = 之后的内容。如何在 .js 文件中找到定义点击事件的位置?
  • @Justin Myles Holmes:只需点击“事件=”框即可查看。
【解决方案4】:

那么 eventbug 会向你展示一个元素的所有事件处理程序, http://getfirebug.com/releases/eventbug 但通常处理程序是一些通用代码。

【讨论】:

  • 我查看了 eventbug,它似乎只是将我带到了 DOM 选项卡中显示的相同信息。它似乎没有回答骆驼的问题。如果我错了,请告诉我。我真的很感激这个建议。 :-)
  • 好吧:你错了!实际上,由于您没有发布测试用例,因此无法判断您是否错了。所以我帮不了你。
  • 我可以在我的问题中添加什么使其符合“测试用例”的条件?
  • 一些 HTML 和 jQuery 的脚本标签。 bigButton 和 theLlama 是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
相关资源
最近更新 更多