#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 за указание на это.