jQuery/Javascript temporarily disable events attached by addEventListener/attachEvent

六眼飞鱼酱① 提交于 2019-12-10 18:08:13

问题


Is there a way to temporarily disable an event listener?

In my case, I have a third party library (not jQuery centric) that creates mouseover/mouseout events on an element using addEventListener/attachEvent.

Under certain circumstances another event fires on a different element and I need to disable those event listeners. My solution thus far has been to simply unbind the mouseover/mouseout. This usually works fine because that event generally causes the page to refresh.

However, every now and again an error can occur (think validation error) that results in the page not refreshing, and I need to re-attach the mouseover/mouseout event listeners.

Helpful information

It's probably worth mentioning that because the mouseover/mouseout event listeners are created and attached within a third party library I cannot simply assign the event to a variable and bind/unbind it in that manner (which AFIK is the best way to do this).

Update

I had originally asked

Is there a way in jQuery to get the event listeners already assigned to an object?

I have since found out it is impossible to access events assigned by addEventListener/attachEvent: Access events added with attachEvent() / addEventListener() in JavaScript


回答1:


jQuery uses data to store events internally, so you can use it to get all of the event handlers for an object:

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

You can then remove a specific handler by using unbind:

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



回答2:


Unfortunately, you can't access them. At best, you can remove event listeners using W3C's removeEventListener (docs) and/or Microsofts detachEvent (docs). Once the listener is removed, however, it's gone for good.

There's one caveat with removeEventListener, in that if the event was registered twice, once indicating to capture, and once indicating not to capture, you must remove it twice; once for each case.

To learn more about capturing and not capturing, see the W3C spec.




回答3:


If you want to temporarily disable an event handler being run, why not just add escape code to the function?

like so:

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

Then if you want to disable an event on a specific element, just call

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

The event handler is still run, but it will return immediately.



来源:https://stackoverflow.com/questions/5162084/jquery-javascript-temporarily-disable-events-attached-by-addeventlistener-attach

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!