【问题标题】:Can I find events bound on an element with jQuery?我可以使用 jQuery 找到绑定在元素上的事件吗?
【发布时间】:2011-01-01 18:57:07
【问题描述】:

我在这个链接上绑定了两个事件处理器:

<a href='#' id='elm'>Show Alert</a>

JavaScript:

$(function()
{
  $('#elm').click(_f);
  $('#elm').mouseover(_m);
});

function _f(){alert('clicked');}
function _m(){alert('mouse over');}

有没有办法获取绑定在一个元素上的所有事件的列表,在这种情况下是在带有id="elm" 的元素上?

【问题讨论】:

    标签: javascript jquery jquery-events


    【解决方案1】:

    您现在可以使用 javascript 函数 getEventListeners() 简单地获取绑定到对象的事件侦听器列表。

    例如,在开发工具控制台中键入以下内容:

    // Get all event listners bound to the document object
    getEventListeners(document);
    

    【讨论】:

    • 我认为这不是本机功能,需要以下脚本/依赖项:github.com/colxi/getEventListeners 这应该添加到答案中,否则会产生误导。但是感谢您让我使用那个“插件”;看起来不错。 :)
    【解决方案2】:

    请注意,事件可能附加到文档本身而不是相关元素。在这种情况下,您需要使用:

    $._data( $(document)[0], "events" );
    

    并使用正确的选择器找到事件:

    然后看看handler > [[FunctionLocation]]

    【讨论】:

      【解决方案3】:

      一般情况:

      • F12 打开开发工具
      • 点击Sources标签
      • 在右侧,向下滚动到 Event Listener Breakpoints,然后展开树
      • 点击您要收听的事件。
      • 与目标元素交互,如果它们触发,您将在调试器中获得一个断点

      同样,您可以:

      • 右键单击目标元素 -> 选择“Inspect element
      • 在开发框架的右侧向下滚动,底部是“event listeners”。
      • 展开树以查看附加到元素的事件。不确定这是否适用于通过冒泡处理的事件(我猜不是)

      【讨论】:

      • 我同意这是首选方法,并且是一种通用解决方案,而不是依赖 jQuery,它可能可用也可能不可用。
      • @dead umm... 该问题专门针对 jQuery 并在示例附件中使用 jQuery - 答案应仅在 jQuery(?) 的上下文中有效
      • 在其他情况下理解答案也很有帮助。仅仅因为有人问了一个特定的问题,并不意味着他们将收到的受限答案是最好的答案。尤其是对于 jQuery,人们倾向于依赖它作为拐杖。了解底层架构很重要。这个答案表明 jQuery 甚至不是必需的。问题和示例过于模糊,无法了解其用法,因此可以解释什么可以被视为有效答案。
      【解决方案4】:

      虽然这并不完全特定于 jQuery 选择器/对象,但在 FireFox Quantum 58.x 中,您可以使用开发工具在元素上找到事件处理程序:

      1. 右键单击元素
      2. 在上下文菜单中,单击“检查元素”
      3. 如果元素旁边有“ev”图标(黄色框),请点击“ev”图标
      4. 显示该元素和事件处理程序的所有事件

      【讨论】:

      • 很棒的答案,尤其是截图让它变得容易多了。感谢您的努力!
      【解决方案5】:

      在现代版本的 jQuery 中,您可以使用 $._data 方法来查找由 jQuery 附加到相关元素的任何事件。 注意,这是一种仅供内部使用的方法:

      // Bind up a couple of event handlers
      $("#foo").on({
          click: function(){ alert("Hello") },
          mouseout: function(){ alert("World") }
      });
      
      // Lookup events for this particular Element
      $._data( $("#foo")[0], "events" );
      

      $._data 的结果将是一个包含我们设置的两个事件的对象(如下图所示,mouseout 属性已展开):

      然后在 Chrome 中,您可以右键单击处理函数并单击“查看函数定义”以显示它在代码中定义的确切位置。

      【讨论】:

      • 这仅适用于通过 jQuery 助手绑定的元素。
      • @jammypeach 我正在尝试您的解决方案,但仍然为选择器返回未定义。我用 $('#elem').bind('click', function() {});如果这会有所作为。
      • @marcus 啊哈,哎呀,我错过了一些东西,抱歉 :) $._data(element[0], ‘events’);
      • 现在必须使用:$._data( $('#foo')[0] ).events
      • $._data() 被 JQuery 内部使用。 $.data() 是用户的公共方法。 $.data(element, 'events') 工作正常。
      【解决方案6】:

      我为后代添加这个;有一种更简单的方法,不需要编写更多的 JS。使用amazing firebug addon for firefox

      1. 右键单击元素并选择“使用 Firebug 检查元素”
      2. 在侧边栏面板中(如屏幕截图所示),使用微小的 > 箭头导航到事件选项卡
      3. 事件选项卡显示每个事件的事件和相应的功能
      4. 旁边的文字显示了函数的位置

      【讨论】:

      • 这在 IE 开发工具中也可用。
      【解决方案7】:

      我使用了这样的东西 if($._data($("a.wine-item-link")[0]).events == null) { ... 做一些事情,几乎再次绑定他们的事件处理程序} 检查我的元素是否绑定到任何事件。如果您已从该元素中取消附加所有事件处理程序,它仍然会显示 undefined (null)。这就是我在 if 表达式中评估它的原因。

      【讨论】:

        【解决方案8】:

        jQuery Audit plugin 插件应该可以让您通过普通的 Chrome 开发工具执行此操作。它并不完美,但它应该让您看到绑定到元素/事件的实际处理程序,而不仅仅是通用 jQuery 处理程序。

        【讨论】:

          【解决方案9】:

          当我像这样向 $._data 传递一个有点复杂的 DOM 查询时:$._data($('#outerWrap .innerWrap ul li:last a'), 'events') 它会在浏览器控制台中抛出 undefined。

          所以我不得不在父 div 上使用 $._data:$._data($('#outerWrap')[0], 'events') 来查看 a 标签的事件。这是相同的 JSFiddle:http://jsfiddle.net/giri_jeedigunta/MLcpT/4/

          【讨论】:

          • 这样做的原因是您从$('#outerWrap') 委派活动。事件实际上是绑定到该元素而不是单个锚点。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-09
          • 2015-12-04
          • 2019-08-23
          相关资源
          最近更新 更多