使用jQuery,是否有可能获得所有事件的列表和事件绑定到哪个元素?
解决方法
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',' 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
更新:
我添加了一些处理程序和一些关于委托事件的信息到上述函数的输出。
UPDATE(8/24/2012):
虽然上面的函数仍然在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).addBack().each(function() { // the following line is the only change var e = $._data(this,this); } })(jQuery);
UPDATE(4/25/2013):
andSelf()已从1.8.x http://bugs.jquery.com/ticket/9800中弃用,我改用addBack()。