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

2020/10/19 14:41 · javascript ·  · 0评论

是否可以使用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() );

    });

});

另一种方法是可以使用以下书签,但是显然这在运行时无济于事。

当尚不存在时取消绑定不是最佳解决方案,但似乎足够有效!第二次单击时,您可以确定不会创建重复的绑定。

因此,我像这样使用die()或unbind():

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

要么

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

或在最新的jQuery版本中:

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

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

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

希望这可以帮助。

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

$(element).data(“ events”):现在在1.8中已将其删除,但是您仍然可以通过$ ._ data(element,“ events”)获取事件数据以进行调试。
请注意,这不是受支持的公共接口。实际的数据结构可能因版本而异。

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

我认为这可能已经用jQuery 1.9更新了。*

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

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

我写了一个很小的插件,叫做“ once”,可以做到这一点:

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

简单地说:

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

对于jQuery 1.9+

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

我需要[0]数组文字。

我认为提到的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') )  ...

它在这里可用:jquery-handler-toolkit.js

参考SJG的回答以及来自W3Schools.com

从jQuery 1.7版本开始,off()方法是unbind(),die()和undelegate()方法的新替代品。此方法为API带来了很多一致性,我们建议您使用此方法,因为它可以简化jQuery代码库。

这给出:

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

要么

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

这对我有用:$('#profile1')。attr('onclick')

本文地址:http://javascript.askforanswer.com/ceshishijianchulichengxushifoubangdingdaojqueryzhongdeyuansuzhongfu.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!