Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 测试事件处理程序是否绑定到jQuery中的元素_Javascript_Jquery - Fatal编程技术网

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

Javascript 测试事件处理程序是否绑定到jQuery中的元素,javascript,jquery,Javascript,Jquery,是否可以使用jQuery确定元素是否有一个单击处理程序、一个更改处理程序或任何类型的事件处理程序绑定到它 此外,是否可以确定给定类型的事件有多少单击处理程序(或任何类型的事件处理程序),以及事件处理程序中有哪些函数?您可以从数据缓存中获取此信息 例如,将它们记录到控制台(firebug,ie8): 或者迭代它们: jQuery.each($('#someElementId').data('events'), function(i, event){ jQuery.each(event,

是否可以使用jQuery确定元素是否有一个单击处理程序、一个更改处理程序或任何类型的事件处理程序绑定到它


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

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

例如,将它们记录到控制台(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");