【发布时间】:2010-11-17 04:32:30
【问题描述】:
是否可以使用 jQuery 确定一个元素是否具有单击处理程序、更改处理程序或任何类型的事件处理程序?
此外,是否可以确定对于给定类型的事件有多少点击处理程序(或任何类型的事件处理程序),以及事件处理程序中有哪些功能?
【问题讨论】:
标签: javascript jquery
是否可以使用 jQuery 确定一个元素是否具有单击处理程序、更改处理程序或任何类型的事件处理程序?
此外,是否可以确定对于给定类型的事件有多少点击处理程序(或任何类型的事件处理程序),以及事件处理程序中有哪些功能?
【问题讨论】:
标签: javascript 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() );
});
});
另一种方法是您可以使用以下bookmarklet,但显然这在运行时没有帮助。
【讨论】:
live (jQuery 1.4.4, FF) 附加的事件。
$(element).data('events') 已在 jQuery 1.8 中删除。对于“调试,您可以使用$._data(element, 'events'),但它没有记录(并且可能会更改)。blog.jquery.com/2012/08/09/jquery-1-8-released
对于 jQuery 1.9+
var eventListeners = $._data($('.classname')[0], "events");
我需要 [0] 数组字面量。
【讨论】:
我写了一个非常小的插件,叫做“once”:
$.fn.once = function(a, b) {
return this.each(function() {
$(this).off(a).on(a,b);
});
};
简单地说:
$(element).once('click', function(){
});
【讨论】:
.one -- api.jquery.com/one -- 相同 -- 自 v1.1 以来一直存在。您的只是添加了一个额外的“c”。
我也有同样的需求并迅速修补了现有代码,以便能够执行以下操作:
if( $('.scroll').hasHandlers('mouseout') ) // could be click, or '*'...
{
... code ..
}
它也适用于事件委托:
if ( $('#main').hasHandlers('click','.simple-search') ) ...
【讨论】:
在绑定尚不存在时将其终止不是最佳解决方案,但似乎足够有效!第二次“单击”时,您可以确定它不会创建重复绑定。
因此我像这样使用 die() 或 unbind():
$("#someid").die("click").live("click",function(){...
或
$("#someid").unbind("click").bind("click",function(){...
或在最近的 jQuery 版本中:
$("#someid").off("click").on("click",function(){...
【讨论】:
.off("click") 而不是 .die() 或 .unbind()
我认为这可能已经更新为 jQuery 1.9.*
我发现这是目前唯一对我有用的东西:
$._data($("#yourElementID")[0]).events
【讨论】:
参考SJG's answer和来自W3Schools.com
从 jQuery 1.7 版开始,off() 方法是 unbind()、die() 和 undelegate() 方法的新替代品。这种方法给 API 带来了很大的一致性,我们建议您使用这种方法,因为它简化了 jQuery 代码库。
这给出了:
$("#someid").off("click").live("click",function(){...
或
$("#someid").off("click").bind("click",function(){...
【讨论】:
$("#someid").off("click").on("click",function(){...
自 jQuery 1.8 起不再支持此解决方案,我们可以在此处的博客上阅读:
$(element).data(“events”):现在在 1.8 中已删除,但您仍然可以访问 通过 $._data(element, "events") 进行调试的事件数据。 请注意,这不是受支持的公共接口;实际数据 结构可能因版本而异。
因此,您应该取消绑定/重新绑定它,或者简单地使用布尔值来确定您的事件是否已附加(我认为这是最好的解决方案)。
【讨论】:
$._data 现在是做什么的?
这对我有用: $('#profile1').attr('onclick')
【讨论】:
$('#profile1').click(function(){alert('')});? $('#profile1').attr('onclick') 返回undefined。
我认为提到的 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 内部的摆布,我真的不应该这样做!
【讨论】:
我编写了一个名为 hasEventListener 的插件,它正是这样做的:
http://github.com/sebastien-p/jquery.hasEventListener
希望这会有所帮助。
【讨论】:
live 绑定事件。 (v1.0.5)