当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《测试事件处理程序是否绑定到jQuery中的元素》经验,为你挑选了8个好方法。

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

此外,是否可以确定它对于给定类型的事件有多少点击处理程序(或任何类型的事件处理程序),以及事件处理程序中有哪些功能?



1> redsquare..:

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

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

    });

});

另一种方法是你可以使用下面的书签,但显然这在运行时没有帮助.


只需注意:`$(element).data('events')`已在jQuery 1.8中删除.对于"调试,你可以使用`$ ._ data(element,'events')`,但它没有文档(可能会改变).http://blog.jquery.com/2012/08/09/jquery-1-8 -released /
是拉斯,我是真的.但内联处理程序是严峻的,不值得展示!
@redsquare当然我已经预料到了.您可以查看数百个不断更新的热门答案.
这只适用于分配了jQuery的事件处理程序吗?
很好的答案.我只想提一下,这不适用于附带`live`(jQuery 1.4.4,FF)的事件.
@gotqn你希望每个人都更新他们的所有答案,以便与新的api保持联系,注意答案的日期.....
$ ._数据($( "#元件")[0]).事件
这些解决方案不再有效.您现在必须手动设置布尔变量.

2> SJG..:

当绑定不存在时终止绑定不是最好的解决方案,但似乎足够有效!第二次"点击"时,您可以肯定地知道它不会创建重复的绑定.

因此我使用die()或unbind(),如下所示:

$("#someid").die("click").live("click",function(){...

要么

$("#someid").unbind("click").bind("click",function(){...

或者在最近的jQuery版本中:

$("#someid").off("click").on("click",function(){...


尽管它没有回答这个问题,但+1非常整洁.
对于jQuery 1.7及更高版本,使用`.off("click")`而不是`.die()`或`.unbind()`
那对我有帮助!谢谢 :)
我想为这个简单的解决方案给你1000 + 1.
我想补充一点,如果你需要附加一个只运行一次然后自行删除的事件,请使用one()方法.$("body").one("click",function(){alert('test');});

3> 小智..:

我写了一个名为hasEventListener的插件,它正是这样做的:

http://github.com/sebastien-p/jquery.hasEventListener

希望这可以帮助.


喜欢......你有机会提供兼容1.9的版本吗?
对于使用jQuery的任何人来说,这个插件应该是公认的答案.
为什么jQuery本身不是这个部分!干得好+1

4> adriendenat..:

自jQuery 1.8以来,我们不再支持此解决方案,因为我们可以在博客上阅读:

$(element).data("events"):现在在1.8中删除了它,但您仍然可以通过$ ._ data(element,"events")获取事件数据以进行调试. 请注意,这不是受支持的公共接口; 实际的数据结构可能会因版本不同而发生变化.

因此,您应该取消绑定/重新绑定它,或者只是使用布尔值来确定您的事件是否已被附加(在我看来这是最佳解决方案).



5> jtromans..:

我想这可能已经用jQuery 1.9更新了.*

我发现这是目前唯一对我有用的东西:

$._data($("#yourElementID")[0]).events



6> Rodolfo Jorg..:

我写了一个名为"once"的非常小的插件,它可以做到这一点:

$.fn.once = function(a, b) {
    return this.each(function() {
        $(this).off(a).on(a,b);
    });
};

简单地说:

$(element).once('click', function(){
});


这似乎与jQuery的`.one`相同-http://api.jquery.com/one/-从v1.1开始就存在。您只是添加了一个额外的“ c”。

7> Learning sta..:

对于jQuery 1.9+

var eventListeners = $._data($('.classname')[0], "events");

我需要[0]数组文字.



8> Julian Jelfs..:

我不认为提到的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内部的摆布,我真的不应该这样做!

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有