【发布时间】:2009-04-13 13:22:51
【问题描述】:
使用 jQuery,是否可以获得所有事件的列表以及事件绑定到哪个元素?
【问题讨论】:
-
bugs.jquery.com/ticket/10589 .data('events') 现在消失了
-
谢谢@SkylarSaveland,我正在下面更新我的答案。
标签: javascript jquery events
使用 jQuery,是否可以获得所有事件的列表以及事件绑定到哪个元素?
【问题讨论】:
标签: javascript jquery events
jQuery 使这相对容易,因为它将事件处理程序存储在元素数据中。你应该可以使用这样的东西:
(function($) {
$.eventReport = function(selector, root) {
var s = [];
$(selector || '*', root).andSelf().each(function() {
// the following line is the only change
var e = $.data(this, 'events');
if(!e) return;
s.push(this.tagName);
if(this.id) s.push('#', this.id);
if(this.className) s.push('.', this.className.replace(/ +/g, '.'));
for(var p in e) {
var r = e[p],
h = r.length - r.delegateCount;
if(h)
s.push('\n', h, ' ', p, ' handler', h > 1 ? 's' : '');
if(r.delegateCount) {
for(var q = 0; q < r.length; q++)
if(r[q].selector) s.push('\n', p, ' for ', r[q].selector);
}
}
s.push('\n\n');
});
return s.join('');
}
$.fn.eventReport = function(selector) {
return $.eventReport(selector, this);
}
})(jQuery);
你可以这样称呼它:
// all events
alert($.eventReport());
// just events on inputs
alert($.eventReport('input'));
// just events assigned to this element
alert($.eventReport('#myelement'));
// events assigned to inputs in this element
alert($.eventReport('input', '#myelement'));
alert($('#myelement').eventReport('input')); // same result
// just events assigned to this element's children
alert($('#myelement').eventReport());
alert($.eventReport('*', '#myelement'); // same result
更新: 我在上述函数的输出中添加了一些处理程序和一些有关委托事件的信息。
更新(2012 年 8 月 24 日):
虽然上面的函数在 jQuery 1.7.2 及更低版本中仍然有效,但 jQuery 不再将事件对象存储在jQuery.data(elem, 'events') 和 如果您使用的是 jQuery 1.8 或更高版本,您将无法再使用上面的函数!
作为jQuery.data(elem, 'events') 的交换,您现在可以使用jQuery._data(elem, 'events')。对上述函数的更新如下所示:
(function($) {
$.eventReport = function(selector, root) {
var s = [];
$(selector || '*', root).addBack().each(function() {
// the following line is the only change
var e = $._data(this, 'events');
if(!e) return;
s.push(this.tagName);
if(this.id) s.push('#', this.id);
if(this.className) s.push('.', this.className.replace(/ +/g, '.'));
for(var p in e) {
var r = e[p],
h = r.length - r.delegateCount;
if(h)
s.push('\n', h, ' ', p, ' handler', h > 1 ? 's' : '');
if(r.delegateCount) {
for(var q = 0; q < r.length; q++)
if(r[q].selector) s.push('\n', p, ' for ', r[q].selector);
}
}
s.push('\n\n');
});
return s.join('');
}
$.fn.eventReport = function(selector) {
return $.eventReport(selector, this);
}
})(jQuery);
更新(2013 年 4 月 25 日):
andSelf() 已从 1.8.x http://bugs.jquery.com/ticket/9800 弃用,我改为使用 addBack() 替换。
【讨论】:
// List bound events
console.log($('#elem').data('events'));
// Log ALL handlers for ALL events
$.each($('#elem').data('events'), function(i, event) {
$.each(event, function(i, handler){
console.log(handler.toString());
});
});
【讨论】:
我用这个来列出所有有界事件的元素。
$('*').each(function(){
var events = $(this).data('events');
if(events != null)
{
console.log(this);
console.log(events);
}
});
还可以通过编写一些额外的代码来收集元素作为每个事件的列表:
var eventArrays = {};
$('*').each(function(){
var events = $(this).data('events');
for(var anEvent in events){
if(!eventArrays[anEvent])
eventArrays[anEvent] = [];
eventArrays[anEvent].push(this);
}
});
console.log(eventArrays);
【讨论】:
我敢打赌,您可以遍历 DOM 并检查每个元素上的事件 attribute 构建一个列表...但我从未尝试过。
【讨论】:
为了使用 console.table() 我做了一些修改...
(function($) {
$.eventReport = function(selector, root) {
var s = [];
$(selector || '*', root).addBack().each(function() {
var e = $._data(this, 'events');
if(!e) return;
var tagGroup = this.tagName || "document";
if(this.id) tagGroup += '#' + this.id;
if(this.className) tagGroup += '.' + this.className.replace(/ +/g, '.');
var delegates = [];
for(var p in e) {
var r = e[p];
var h = r.length - r.delegateCount;
if(h)
s.push([tagGroup, p + ' handler' + (h > 1 ? 's' : '')]);
if(r.delegateCount) {
for(var q = 0; q < r.length; q++)
if(r[q].selector) s.push([tagGroup + ' delegates', p + ' for ' + r[q].selector]);
}
}
});
return s;
}
$.fn.eventReport = function(selector) {
return $.eventReport(selector, this);
}
})(jQuery);
所以现在我可以这样做了:
console.table($.eventReport())
看看 chrome 会发生什么:
【讨论】: