removeEventListener не выполняется или не работает

#javascript #jquery

#javascript #jquery

Вопрос:

Я пытаюсь выяснить, почему мой removeEventListener не работает, я перепробовал несколько способов исправить это, но все еще не работает, было бы полезно какое-либо понимание. addEventListener работает по назначению, но проблема возникает, когда я пытаюсь удалить прослушиватель. Ниже приведен фрагмент кода, о котором идет речь. Любые предложения или помощь приветствуются.

 init: function(el, callback) {
     var that = this;
     this.touchSurface = el;
     this.touchSurface.addEventListener('touchstart', function(e){ that.onStart(e); }, false);
     this.touchSurface.removeEventListener('touchstart',function(e){ that.onStart(e); }, false);
},

onStart: function(e) {
   //Do something
}
 

Комментарии:

1. Почему вы удаляете событие чуть ниже add?

2. Мой плохой, я не включил весь код, но после добавления слушателя addEvent я выполняю определенные манипуляции с DOM, прежде чем пытаться removeEventListener

3. Но если вы добавляете и удаляете в одном и том же последовательном выполнении кода (независимо от того, сколько промежуточного кода), у события никогда не будет шансов быть обработанным.

Ответ №1:

Когда вы удаляете EventListener, вы должны передать фактическую ту же ссылку на функцию. Вы передаете другую функцию (которая имеет тот же код, но другую функцию).

Способ решить эту проблему — поместить обратный вызов в свою собственную функцию, а затем вы можете ссылаться на ту же самую функцию в обоих .addEventListener() и .removeEventListener() .


Я не уверен, почему вы пытаетесь добавлять, а затем удалять прослушиватель событий сразу друг за другом (поскольку в этом нет никакой пользы), но вы могли бы сделать это следующим образом:

 init: function(el, callback) {
     var that = this;

     function handleStart(e) {
         that.onStart(e);
     }


     this.touchSurface = el;
     el.addEventListener('touchstart', handleStart), false);
     el.removeEventListener('touchstart', handleStart, false);
},
 

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

Комментарии:

1. Проблема заключалась в том, что я не передавал одну и ту же ссылку, хотя код был одинаковым. Спасибо jfriend00 за указание на это.