Я создал следующий, чрезвычайно простой модуль для обработки делегирования событий. Это нормально работает для создания делегированного слушателя.
export const delegate = (function() {
const events = {};
return ({
base = 'document',
selector,
type,
callback,
listenerName,
remove = false,
useCapture = false
}) => {
events[listenerName] = function(e) {
for (
let target = e.target;
target && target !== this;
target = target.parentNode
) {
if (target.matches(selector)) {
callback.call(target, e);
break;
}
}
};
if (remove) {
window[base].removeEventListener(type, events[listenerName], useCapture);
delete events[listenerName];
return;
}
window[base].addEventListener(type, events[listenerName], useCapture);
};
})();
Вызывается так:
delegate({...configWithRemoveNotSet})
Я также создал временного помощника для проверки возможности удаления ранее добавленного прослушивателя событий, передавая все те же значения, что и я, чтобы добавить прослушиватель, но переключив логическое значение remove
на true
.
window.testRemoveListener = () => delegate({...sameConfigWithRemoveSetToTrue});
Я могу убедиться, что функция прослушивателя правильно удалена из объекта events
, и что removeEventListener
также был вызван.
Я ожидал, что моя тестовая функция удалит ранее добавленный прослушиватель событий. Но слушатель продолжает стрелять.
Спасибо за любые идеи о том, что я делаю здесь неправильно.