// В функциональном стиле. В данном коде работает каждая функция и все открывается и закрывается как должно.
// При открытии модального окна навешивается обработчик на нажатие клавиши ESC и если окно открыто, то при
// нажатие ESC оно закрывается и вместе с закрытием удаляется обрабочик нажатия клавиши
function bindModal() {
modal.addEventListener(`click`, (evt) => {
if (evt.target === modal) {
closePopup()
}
})
triggers.forEach(trigger => {
trigger.addEventListener(`click`, () => openPopup())
})
closeModalBtn.addEventListener(`click`, () => closePopup())
}
function openPopup() {
modal.style.display = `block`
document.addEventListener(`keydown`, (evt) => onPopupCloseEscPress(evt))
}
function closePopup() {
modal.style.display = ``
document.removeEventListener(`keydown`, (evt) => onPopupCloseEscPress(evt))
}
function onPopupCloseEscPress(evt) {
if (evt.key === `Escape`) {
closePopup()
}
}
// В ООП стиле, код почти один в один
// В данном коде тоже все работает и даже при нажатие клавиши ESC всё закрывается, но если проверить
// и вывести в консоль event, то даже после закрытия overlay'я события продолжают выводиться в консоль.
bindTriggers() {
this.overlay.addEventListener(`click`, (evt) => {
if (evt.target === this.overlay) {
this.closeOverlay();
}
});
this.close.addEventListener(`click`, () => this.closeOverlay())
this.btns.forEach(btn => {
btn.addEventListener(`click`, () => {
this.openOverlay();
});
});
}
openOverlay() {
this.overlay.style.display = `flex`;
document.addEventListener(`keydown`, (evt) => this.onOverlayCloseEscPress(evt))
}
closeOverlay() {
this.overlay.style.display = `none`;
document.removeEventListener(`keydown`, (evt) => this.onOverlayCloseEscPress(evt))
}
onOverlayCloseEscPress(evt) {
if (evt.key === `Escape`) {
this.closeOverlay();
console.log(evt)
}
}
проблем с удалением событий не былоРазве?
const listener = event => console.log(event);
element.addEventListener('click', listener);
element.removeEventListener('click', listener);
element.addEventListener('click', event => console.log(event));
element.removeEventListener('click', event => console.log(event));
ибо это 2 разные функции, не смотря на то, что делают одно и то же, и одинаковы до каждого символа.когда программировал в функциональном стилето что в обоих Ваших примерах - это процедурный стиль. От того что Вы завернули код в класс - он не становится ООП, как и то что написали набор функции - не ФП.