使用jQuery访问绑定到事件处理程序的函数

52
使用jQuery,可以使用.bind()或其他事件处理程序助手函数将函数绑定到在DOM对象上触发的事件上。
jQuery必须以某种方式在内部存储此信息。 我想知道是否可能在给定DOM对象的情况下找出已绑定到该对象的事件,并访问那些函数等内容。期望的返回结果可能如下所示:
{
  click: [function1, function2],
  change: [function3],
  blur: [function4, function5, function6]
}

请参考此问题:https://dev59.com/X3E95IYBdhLWcg3wRLwt - Pointy
2个回答

70

jQuery 1.7停止在常规的data()函数中公开事件。您仍然可以像这样获取它们:

var elem = $('#someid')[0];
var data = jQuery.hasData( elem ) && jQuery._data( elem );
console.log(data.events);
请注意,这仅适用于使用jQuery绑定的事件。据我所知,没有办法查看使用常规DOM函数(如addEventListener)绑定的所有事件。
但是你可以在Webkit Inspector中查看它们:在Elements选项卡中导航到所需的DOM节点,在右侧选择“Event Listeners”下拉菜单即可看到它们。

1
只是补充一下,jQuery._data(elem, 'events') 也可以直接用来获取 events 数组。 - Cleric

37

编辑: 以下方法仅适用于 jQuery < 1.7

您可以在本文中找到许多有趣的 jQuery 技巧和窍门:关于 jQuery 的一些你可能不知道的事情

看来 jQuery 使用data来存储事件处理程序:

您可以通过 jQuery 的事件存储访问绑定到元素(或任何对象)的所有事件处理程序:

// List bound events:
console.dir( jQuery('#elem').data('events') );

// Log ALL handlers for ALL events:
jQuery.each($('#elem').data('events'), function(i, event){
    jQuery.each(event, function(i, handler){
        console.log( handler['handler'].toString() );
    });
});

// You can see the actual functions which will occur
// on certain events; great for debugging!

7
在jQuery 1.7及更高版本中,这种方法已不再适用;请参考eikes的答案以获取新的解决方案。 - kevingessner
1
无法工作。尝试过 $(document).data('events')$('html').data('events') -- 无效。 - Cody

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接