3

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

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

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

但是,有时会发生错误(想想验证错误),导致页面不刷新,我需要重新附加 mouseover/mouseout 事件侦听器。

有用的信息

可能值得一提的是,因为 mouseover/mouseout 事件侦听器是在第三方库中创建和附加的,所以我不能简单地将事件分配给一个变量并以这种方式绑定/取消绑定它(AFIK 是最好的方法)。

更新

我本来问

jQuery中有没有办法让已经分配给对象的事件监听器?

从那以后,我发现无法访问 addEventListener/attachEvent 分配的事件:访问在 JavaScript 中使用 attachEvent() / addEventListener() 添加的事件

4

3 回答 3

1

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

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

然后,您可以使用以下方法删除特定处理程序unbind

$("#foo").unbind('click', $("#foo").data("events").click[42]);
于 2011-03-02T00:35:44.623 回答
1

不幸的是,您无法访问它们。充其量,您可以使用 W3C removeEventListener文档)和/或 Microsoft detachEvent文档)删除事件侦听器。但是,一旦删除了侦听器,它就永远消失了。

有一个警告removeEventListener,如果事件被注册了两次,一次表示捕获,一次表示不捕获,您必须将其删除两次;每个案例一次。

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

于 2011-03-02T00:59:58.583 回答
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');

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

于 2014-01-21T11:14:37.120 回答