2011-03-02 58 views
3

有没有办法暂时禁用事件侦听器?jQuery/Javascript暂时禁用addEventListener/attachEvent附加的事件

就我而言,我有一个第三方库 jQuery的中心),使用的addEventListener /的attachEvent元素上创建鼠标悬停/鼠标移开事件。

在某些情况下,另一个事件触发不同的元素,我需要禁用这些事件侦听器。到目前为止,我的解决方案一直是简单地使用鼠标悬停/鼠标悬停的unbind。这通常工作正常,因为该事件通常会导致页面刷新。

但是,每隔一段时间都会出现一个错误(认为验证错误),导致页面不刷新,并且需要重新附加mouseover/mouseout事件侦听器。

有用信息

这也许值得一提的是,因为在创建鼠标悬停/ mouseout事件侦听器和第三方库中的连接,我不能简单地将事件指派给一个变量,并绑定/以这种方式解除绑定(AFIK是做这件事的最好方法)。

更新

我原本问

是否有jQuery的办法让已经分配给对象的事件侦听器?

我后来发现它是不可能通过的addEventListener /的attachEvent分配访问事件:Access events added with attachEvent()/addEventListener() in JavaScript

回答

1

jQuery使用data存储在内部的事件,所以你可以用它来获取所有的事件处理程序的一个对象:

$("#foo").data("events") 

然后,您可以通过使用unbind删除特定的处理程序:

$("#foo").unbind('click', $("#foo").data("events").click[42]); 
+0

我应该提到最初附加mouseover/mouseout事件监听器的库不是一个jQuery插件,而是使用本地addEventListener/attachEvent。 – xzyfer 2011-03-02 00:40:35

+0

我的歉意,我更新了这个问题来陈述它。 – xzyfer 2011-03-02 00:42:41

+0

啊,好的。我的回答可能仍会帮助来自Google的用户,所以我会放弃它。你是否试图禁用所有*事件监听器,或者只是其中的一部分? – Emmett 2011-03-02 00:47:21

1

不幸的是,您无法访问它们。充其量,您可以使用W3C的removeEventListenerdocs)和/或Microsofts detachEventdocs)删除事件监听器。然而,一旦听众被移除,它就会消失。

有一点需要特别注意removeEventListener,即如果该事件被注册了两次,一次指示捕捉,一旦指示未捕捉到,你必须将其删除两次;每个案件一次。

要了解有关捕获和未捕获的更多信息,请参阅W3C spec

+0

我知道这一点,谢谢。但是,使用jQuery的“unbind”可以有效地删除使用addEventListener/attachEvent附加的事件事件。我的问题是在本地缓存事件侦听器,以便我可以重新附加它,或者暂时禁用/重新启用它,而无需明确删除它。 – xzyfer 2011-03-02 01:03:59

+0

您无法缓存侦听器并重新附加它们。他们无法访问。 – ntownsend 2011-03-17 17:29:35

0

如果您想临时禁用正在运行的事件处理程序,为什么不只是将转义码添加到该函数?

像这样:

$('#button').click(function(){ 
    var clicked_element = $(this); 
    if(elem.hasClass('event-click-disabled')) 
    { 
     // logging code so we know exactly what events are being skipped 
     console.info(
      'The click event on following element was skipped', 
      clicked_element 
     ); 
     return; 
    } 
    alert('Button clicked'); 
}); 

这时如果要禁用特定元素上的事件,只需调用

element.addClass('event-click-disabled'); 

事件处理程序仍在运行,但它会立即返回。