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');
事件处理程序仍在运行,但会立即返回。