使用jQuery,能否确定元素是否具有点击处理程序、更改处理程序或任何类型的事件处理程序?
此外,能否确定给定类型事件的点击处理程序(或其他类型的事件处理程序)的数量以及事件处理程序中包含的函数有哪些?
使用jQuery,能否确定元素是否具有点击处理程序、更改处理程序或任何类型的事件处理程序?
此外,能否确定给定类型事件的点击处理程序(或其他类型的事件处理程序)的数量以及事件处理程序中包含的函数有哪些?
console.dir( $('#someElementId').data('events') );
或者遍历它们:jQuery.each($('#someElementId').data('events'), function(i, event){
jQuery.each(event, function(i, handler){
console.log( handler.toString() );
});
});
另一种方法是您可以使用以下书签工具,但显然这不能在运行时帮助。
当绑定还不存在时将其删除并不是最好的解决方案,但似乎足够有效!第二次“点击”时,您可以确信它不会创建重复的绑定。
因此,我使用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()
。 - David Clarke$(“#someid”).die(“click.myPlugin”).live(“click.myPlugin”,function(){...
- Claus Conradhttp://github.com/sebastien-p/jquery.hasEventListener
希望这有所帮助。
hasEventListener
对于 live
绑定的事件不起作用。(v1.0.5) - SooDesuNe自jQuery 1.8开始,此解决方案不再受支持,如我们可以在此处的博客中阅读:
$(element).data("events"):此功能在1.8中已删除, 但您仍可以通过$._data(element, "events")访问事件数据进行调试。 请注意,这不是受支持的公共接口;实际数据结构可能会从版本到版本发生不兼容的更改。
因此,您应该解除绑定/重新绑定它,或者简单地使用布尔值来确定您的事件是否已附加(在我看来这是最好的解决方案)。
$._data
现在是做什么用的? - pilau我认为这可能是使用jQuery 1.9.*更新过的。
目前我发现这是唯一对我有效的东西:
$._data($("#yourElementID")[0]).events
适用于 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(){
});
我认为提到的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内部的支配,而我真的不应该这样做!
我有同样的需求,很快就修补了现有代码,使其能够像这样做:
if( $('.scroll').hasHandlers('mouseout') ) // could be click, or '*'...
{
... code ..
}
if ( $('#main').hasHandlers('click','.simple-search') ) ...
It is available here : jquery-handler-toolkit.js
从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(){...}
。 - Zoltán Süle
$(element).data('events')
。对于“调试”,你可以使用$._data(element, 'events')
,但它是未经记录的(并且可能会更改)。http://blog.jquery.com/2012/08/09/jquery-1-8-released/ - gen_Eric