2010-03-05 128 views
48

使用jQuery,可以使用.bind()或其中一个事件处理函数辅助函数将函数绑定到在DOM对象上触发的事件。使用jQuery访问绑定到事件处理函数的函数

jQuery必须以某种方式内部存储它,我想知道是否有可能给DOM对象,找出哪些事件已经绑定到对象,并访问这些功能等。所需的返回结果可能看起来像这样:

{ 
    click: [function1, function2], 
    change: [function3], 
    blur: [function4, function5, function6] 
} 
+0

看到这个问题:http://stackoverflow.com/questions/2382994/how-to-check-if-any-javascript-event-listeners-handlers-attached-to-an-element-do – Pointy 2010-03-05 16:12:29

回答

35

编辑下面的方法仅适用于jQuery的< 1.7

你可以找到很多有趣的技巧和窍门在这篇文章中:Things you may not know about 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 2012-12-07 16:09:53

+0

我编辑了我的答案来反映这一点。谢谢 – PatrikAkerstrand 2012-12-07 19:19:42

+0

不工作。试过'$(document).data('events')'&'$('html')。data('events')' - 无济于事。 – Cody 2015-06-16 16:56:32

66

jQuery 1.7已停止暴露常规data()函数中的事件。你仍然可以像这样得到它们:

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

请注意,这只适用于使用jQuery绑定的事件。 AFAIK你没有办法看到使用像addEventListener这样的常规DOM函数绑定的所有事件。

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

+1

jQuery._data(elem)在版本1.10.2中正常工作 – rajakvk 2017-01-20 15:59:06

相关问题