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

goo*_*orp 50 jquery events storage internal event-handling

使用jQuery,您可以使用.bind()事件处理程序帮助程序函数或其中一个事件将函数绑定到DOM对象上触发的事件.

jQuery必须以某种方式在内部存储它,我想知道是否有可能给定一个DOM对象,找出哪些事件已绑定到该对象,并访问这些函数等.所需的返回结果可能如下所示:

{
  click: [function1, function2],
  change: [function3],
  blur: [function4, function5, function6]
}
Run Code Online (Sandbox Code Playgroud)

eik*_*kes 67

jQuery 1.7已经停止在常规data()函数中公开事件.你仍然可以像这样得到它们:

var elem = $('#someid')[0];
var data = jQuery.hasData( elem ) && jQuery._data( elem );
console.log(data.events);
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于使用jQuery绑定的事件.AFAIK你无法看到使用常规DOM函数(如addEventListener)绑定的所有事件.

您可以在webkit检查器中看到它们:在Elements选项卡中导航到所需的DOM节点,在右侧选择"Event Listeners"下拉列表.


Pat*_*and 35

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

您可以在本文中找到许多有趣的提示和技巧:您可能不了解的有关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!
Run Code Online (Sandbox Code Playgroud)

  • 这不再适用于jQuery 1.7及更新版本; 看到eikes对新方式的回答. (7认同)