是否可以使用jQuery确定元素是否具有单击处理程序,更改处理程序或绑定到它的任何类型的事件处理程序?
此外,是否可以确定它对于给定类型的事件有多少点击处理程序(或任何类型的事件处理程序),以及事件处理程序中有哪些函数?
答案 0 :(得分:141)
您可以从数据缓存中获取此信息。
例如,将它们记录到控制台(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() );
});
});
另一种方法是你可以使用以下bookmarklet但显然这在运行时没有帮助。
答案 1 :(得分:124)
当绑定不存在时终止绑定不是最好的解决方案,但似乎足够有效!第二次“点击”时,您可以肯定地知道它不会创建重复的绑定。
因此我使用die()或unbind():
$("#someid").die("click").live("click",function(){...
或
$("#someid").unbind("click").bind("click",function(){...
或最近的jQuery版本:
$("#someid").off("click").on("click",function(){...
答案 2 :(得分:34)
答案 3 :(得分:17)
自jQuery 1.8以来,我们不再支持此解决方案,因为我们可以在博客上阅读:
$(element).data(“events”):现在已经在1.8中删除了,但你仍然可以进入 用于调试目的的事件数据通过$ ._ data(element,“events”)。 请注意,这不是受支持的公共接口;实际数据 结构可能会因版本不同而发生变化。
所以,你应该取消绑定/重新绑定它,或者简单地使用布尔值来确定你的事件是否被附加(在我看来是最好的解决方案)。
答案 4 :(得分:15)
我认为这可能已经使用jQuery 1.9更新了。*
我发现这是目前唯一对我有用的东西:
$._data($("#yourElementID")[0]).events
答案 5 :(得分:10)
我写了一个名为“once”的非常小的插件,它可以做到这一点:
$.fn.once = function(a, b) {
return this.each(function() {
$(this).off(a).on(a,b);
});
};
简单地说:
$(element).once('click', function(){
});
答案 6 :(得分:5)
我认为提到的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内部的摆布而且我真的不应该这样做!
答案 7 :(得分:2)
我有同样的需求&快速修补现有代码,以便能够执行以下操作:
if( $('.scroll').hasHandlers('mouseout') ) // could be click, or '*'...
{
... code ..
}
它也适用于事件委托:
if ( $('#main').hasHandlers('click','.simple-search') ) ...
可在此处找到:jquery-handler-toolkit.js
答案 8 :(得分:1)
从jQuery 1.7开始,off()方法是unbind(),die()和undelegate()方法的新替代品。此方法为API带来了很多一致性,我们建议您使用此方法,因为它简化了jQuery代码库。
这给出了:
$("#someid").off("click").live("click",function(){...
或
$("#someid").off("click").bind("click",function(){...
答案 9 :(得分:-6)
这对我有用: $( '#配置文件1')。ATTR(的 'onClick')