jQuery / Javascript暂时禁用addEventListener / attachEvent附加的事件

有没有办法暂时禁用事件监听器?

在我的例子中,我有一个第三方库不是以 jQuery为中心),它使用addEventListener / attachEvent在元素上创建mouseover / mouseout事件。

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

但是,每次都会出现错误(认为validation错误)导致页面无法刷新,我需要重新附加mouseover / mouseout事件侦听器。

有用的信息

值得一提的是,因为mouseover / mouseout事件监听器是在第三方库中创建并附加的,所以我不能简单地将事件分配给变量并以这种方式绑定/取消绑定(AFIK是执行此操作的最佳方式)。

更新

我原先问过

在jQuery中是否有一种方法可以将事件侦听器分配给对象?

我发现不可能访问addEventListener / attachEvent分配的事件 : 在JavaScript中添加了attachEvent()/ addEventListener()的访问事件

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

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

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

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

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

有一个注意事项有removeEventListener ,因为如果事件被注册了两次,一次指示要捕获,一次指示不捕获,你必须删除它两次 ; 每个案例一次。

要了解有关捕获和不捕获的更多信息,请参阅W3C规范 。

如果要暂时禁用正在运行的事件处理程序,为什么不直接向函数添加转义码?

像这样:

 $('#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'); 

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