如何存储侦听器引用?

时间:2018-12-12 01:25:11

标签: javascript pass-by-reference event-listener

我正在尝试存储侦听器函数,以便以后可以将其删除。我正在使用包装器添加侦听器。问题是没有删除侦听器。这是为什么?

下面是一些代码:

    classMyClass{
      // add the wrapper to event listener
       init(){ 
        window.app.addEventListener = function(type, fn, opt){
           obj.listeners.push({type: type, fn: fn, opt: opt});
           console.log('addEvent ', l);
           var l = obj.listeners[obj.listeners.length-1];
           console.log(l);
           window.addEventListener(l.type, l.fn, l.opt);
           //window.removeEventListener(l.type, l.fn, l.opt);
        };
      }
       removeListeners(){
        let obj = this;
        this.listeners.forEach(function() {
           var l = obj.listeners[obj.listeners.length-1];
           console.log('remove ', l);
          // remove the listener
           window.removeEventListener(l.type, l.fn, l.opt);
           obj.listeners.pop();
       });
   }

1 个答案:

答案 0 :(得分:0)

必须使用命名函数注册事件处理程序。

如果确实需要,可以尝试如下操作:

var eventListener = (function()
    function eventCallback() { ... /* whatever that needs to be done for an event */ ... }
    return {
        activate: function() {
            addEventListener(/* add the type of event */, eventCallback);
            console.log("event listener added."); //if you want this here
        },

        deactivate: function() {
            removeEventListener(eventCallback); //removes the event
            console.log("event listener removed."); //if you want this here
        },
    }
)();

然后,您可以使用eventListener.activate()启用监听器,并使用eventListener.deactivate()禁用监听器。请记住,此解决方案仅适用于一个事件。

如果要存储要存储的多个事件函数,则可以执行eventListener的数组。

这里的主要目的是命名函数,因此您以后可以参考它们以删除事件侦听器。