是否可以使用 jQuery 来确定一个元素是否绑定了点击处理程序、更改处理程序或任何类型的事件处理程序?
此外,能否确定特定类型事件有多少个点击处理程序(或任何类型的事件处理程序),以及事件处理程序中有哪些函数?
您可以从数据缓存中获取这些信息。
例如,将它们记录到控制台(firebug、ie8):
console.dir( $('#someElementId').data('events') );
或迭代它们:
jQuery.each($('#someElementId').data('events'), function(i, event){
jQuery.each(event, function(i, handler){
console.log( handler.toString() );
});
});
另一种方法是使用下面的 书签,但在运行时显然无济于事。
我编写了一个名为 hasEventListener 的插件,它可以准确地实现这一功能:
http://github.com/sebastien-p/jquery.hasEventListener
希望对您有所帮助。
我不认为上述 hasEventListener 插件可以处理自定义事件,例如
var obj = {id:'test'};
$(obj).bind('custom', function(){
alert('custom');
}).trigger('custom');
alert($(obj).hasEventListener('custom'));
另外,至少在jQuery 1.5中,我认为你需要小心使用$(target).data('events'),因为对于绑定到上述对象的事件,它的返回值是不同的。
你需要这样做
var events = $(target).data("events");
if(typeof events === "function"){
events = events.events;
}
我正在使用这种方法,它很有效,但感觉有点像我在任由 jquery 内部结构摆布,而且我确实不应该这么做!