Javascript 测试事件处理程序是否绑定到jQuery中的元素
是否可以使用jQuery确定元素是否有一个单击处理程序、一个更改处理程序或任何类型的事件处理程序绑定到它Javascript 测试事件处理程序是否绑定到jQuery中的元素,javascript,jquery,Javascript,Jquery,是否可以使用jQuery确定元素是否有一个单击处理程序、一个更改处理程序或任何类型的事件处理程序绑定到它 此外,是否可以确定给定类型的事件有多少单击处理程序(或任何类型的事件处理程序),以及事件处理程序中有哪些函数?您可以从数据缓存中获取此信息 例如,将它们记录到控制台(firebug,ie8): 或者迭代它们: jQuery.each($('#someElementId').data('events'), function(i, event){ jQuery.each(event,
此外,是否可以确定给定类型的事件有多少单击处理程序(或任何类型的事件处理程序),以及事件处理程序中有哪些函数?您可以从数据缓存中获取此信息 例如,将它们记录到控制台(firebug,ie8): 或者迭代它们:
jQuery.each($('#someElementId').data('events'), function(i, event){
jQuery.each(event, function(i, handler){
console.log( handler.toString() );
});
});
另一种方法是,您可以使用以下方法,但显然这在运行时没有帮助。我编写了一个名为hasEventListener的插件,它正是这样做的:
希望这能有所帮助。我认为上面提到的hasEventListener插件不会处理自定义事件,例如
var obj = {id:'test'};
$(obj).bind('custom', function(){
alert('custom');
}).trigger('custom');
alert($(obj).hasEventListener('custom'));
另外,至少在jQuery1.5中,我认为您需要小心使用$(target).data('events'),因为对于上面绑定到对象的事件,它返回的结果不同
您需要执行以下操作:
var events = $(target).data("events");
if(typeof events === "function"){
events = events.events;
}
我正在使用这种方法,它是有效的,但感觉有点像是我受jquery内部的摆布,我真的不应该这么做 在绑定还不存在时消除它不是最好的解决方案,但似乎已经足够有效了!第二次“单击”时,您可以肯定地知道它不会创建重复的绑定 因此,我使用die()或unbind()如下:
$("#someid").die("click").live("click",function(){...
或
或者在最近的jQuery版本中:
$("#someid").off("click").on("click",function(){...
这对我很有用:
$(“#profile1”).attr('onclick')自从jQuery 1.8以来,这个解决方案不再受支持,我们可以在这里的博客上看到: $(element).data(“events”):现在在1.8中删除了它,但您仍然可以访问 用于调试目的的事件数据,通过$.\u数据(元素,“事件”)。 请注意,这不是受支持的公共接口;实际数据 不同版本的结构可能会发生不兼容的更改。 因此,您应该解除绑定/重新绑定它,或者简单地使用布尔值确定事件是否已附加(我认为这是最佳解决方案)。参考和来自 从jQuery 1.7版开始,off()方法是unbind()、die()和undelegate()方法的新替代方法。此方法为API带来了很多一致性,我们建议您使用此方法,因为它简化了jQuery代码库 这使得:
$("#someid").off("click").live("click",function(){...
或
我想这可能已经用jQuery1.9更新了* 我发现这是目前唯一对我有效的方法:
$._data($("#yourElementID")[0]).events
我也有同样的需求&快速修补现有代码,以便能够执行以下操作:
if( $('.scroll').hasHandlers('mouseout') ) // could be click, or '*'...
{
... code ..
}
它也适用于活动委派:
if ( $('#main').hasHandlers('click','.simple-search') ) ...
这里有:我写了一个非常小的插件,名为“once”,它可以做到这一点:
$.fn.once = function(a, b) {
return this.each(function() {
$(this).off(a).on(a,b);
});
};
简单地说:
$(element).once('click', function(){
});
对于jQuery1.9+
var eventListeners = $._data($('.classname')[0], "events");
我需要
[0]
数组文字。这是否仅适用于使用jQuery分配的事件处理程序?是的,我是真的。但是内联处理程序是可怕的,不应该被显示!回答得很好。我只想指出,这不适用于附加了live
(jQuery 1.4.4,FF)的事件。只需注意:$(元素)。数据('events')
已在jQuery 1.8中删除。对于“调试”,您可以使用$。\u数据(元素,'events')
,但它没有文档记录(可能会更改)@redsquare当然是我所期待的。你可以查看数百个不断更新的流行答案。这个插件应该是使用jQuery的任何人都可以接受的答案。希望我可以为其他人节省一些时间。hasEventListener不适用于live
绑定事件。(v1.0.5)我的hasEventListener插件将于本周更新,现在完全支持实时和委派事件。为什么jQuery的这部分不是本地的!!!做得好+1类似…有没有可能提供1.9兼容版本?+1非常整洁,即使它没有回答问题。这是最好的方法,而且在其他方法失败时,工作方法对我有效对于jQuery 1.7及更高版本,请使用.off(“单击”)
而不是.die()
或.unbind()
这是一个创可贴。最好找出代码执行两次的原因并修复该错误。或者找出调用绑定的其他位置并阻止它。我要补充的是,如果您需要附加一个只运行一次的事件,然后将其自身移除,请使用one()方法。$(“body”).one(“单击”,function(){alert('test');});只有通过“onclick”属性附加处理程序时,它才有效。这种情况如何:$('#profile1')。单击(function(){alert('''');
?$('#profile1')。attr('onclick')
返回未定义的。是否指定了删除它的原因?因为它被使用了(.data)通过jQuery来存储他们的内部事件逻辑。这就是$。\u data
现在所做的吗?我刚刚发现,它解释了一切:)您将在哪里设置布尔值?绑定现在已被弃用,所以最好使用$(“#someid”)。关闭(“单击”)。打开(“单击”,函数(){…
这似乎与jQuery自己的完全相同。one
----从v1.1开始就存在。您的只是添加了一个额外的“c”。@Luke我知道这很旧,但您错了。据我所知,这与jQuery不同。one()只允许事件在自删除之前运行(触发器)一次。This.once()函数只是确保在绑定替换之前删除任何现有的处理程序(这可能会触发多次)。也许函数名是容易混淆的部分,也许最好将其理解为$.fn.replaceOn()?
$.fn.once = function(a, b) {
return this.each(function() {
$(this).off(a).on(a,b);
});
};
$(element).once('click', function(){
});
var eventListeners = $._data($('.classname')[0], "events");