Как хранить ссылки на слушателей? - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь сохранить функции прослушивателя, чтобы потом их можно было удалить.Я использую обертку, чтобы добавить слушателей.Проблема в том, что слушатели не удаляются.Это почему?

Ниже приведен код:

    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 голосов
/ 12 декабря 2018

Обработчик события должен быть зарегистрирован с именованной функцией.

Если вам действительно нужно, вы можете попробовать что-то вроде этого:

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.

Главноездесь присваивается имя функциям , чтобы вы могли обратиться к ним позже, чтобы удалить прослушиватель событий.

...