测试事件处理程序是否绑定到 jQuery 中的元素

是否可以确定一个元素是否有一个 click 处理程序,或者一个变更处理程序,或者使用 jQuery 绑定到它的任何类型的事件处理程序?

此外,是否可以确定对于给定类型的事件它有多少个单击处理程序(或任何类型的事件处理程序) ,以及事件处理程序中有哪些函数?

148160 次浏览

您可以从数据缓存中获得此信息。

例如,将它们记录到控制台(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)时需要小心。数据(‘ events’) ,因为对于上面绑定到对象的事件,它返回的结果是不同的。

你需要这样做:

var events = $(target).data("events");
if(typeof events === "function"){
events = events.events;
}

我正在使用这种方法,它很有效,但是感觉有点像我受到 jquery 内部的摆布,我真的不应该这样做!

当它还不存在的时候杀死它并不是最好的解决方案,但是看起来已经足够有效了!第二次“单击”时,您可以肯定地知道它不会创建重复绑定。

因此,我像这样使用 die ()或 unbind () :

$("#someid").die("click").live("click",function(){...

或者

$("#someid").unbind("click").bind("click",function(){...

或者在最近的 jQuery 版本中:

$("#someid").off("click").on("click",function(){...
这对我有用: $(’# profile1’) . attr (‘ onclick’)

从 jQuery 1.8开始,这个解决方案就不再受到支持了,我们可以在这里的博客上看到:

$(element) . data (“ events”) : 这在1.8中已经删除,但是您仍然可以访问 通过 $. _ data 调试事件数据(元素,“ events”)。 注意,这不是一个受支持的公共接口; 实际的数据 结构可能在不同版本之间不兼容地更改

因此,您应该解除绑定/重新绑定它,或者简单地使用布尔值来确定您的事件是否被附加(我认为这是最好的解决方案)。

参照 SJG 的回答W3Schools.com

在 jQuery 版本1.7中,off ()方法是 unbind ()、 die ()和 uncommittee ()方法的新替代品。此方法为 API 带来了很大的一致性,我们建议您使用此方法,因为它简化了 jQuery 代码库。

这意味着:

$("#someid").off("click").live("click",function(){...

或者

$("#someid").off("click").bind("click",function(){...

我认为这可能已经用 jQuery 1.9进行了更新。 *

我发现这是目前唯一对我有效的方法:

$._data($("#yourElementID")[0]).events

我有同样的需要,并迅速修补现有的代码,以便能够做这样的事情:

 if( $('.scroll').hasHandlers('mouseout') )  // could be click, or '*'...
{
... code ..
}

它也适用于活动代表团:

 if ( $('#main').hasHandlers('click','.simple-search') )  ...

在这里可以买到: Jquery-handler-toolkit. js

我写了一个非常小的插件,叫做“一次”,可以做到这一点:

$.fn.once = function(a, b) {
return this.each(function() {
$(this).off(a).on(a,b);
});
};

简而言之:

$(element).once('click', function(){
});

对于 jQuery 1.9 +

var eventListeners = $._data($('.classname')[0], "events");

我需要 [0]数组字面值。