Если отменить в модальном окне удаление задач, а потом удалить какую-либо задачу, то удаляются ранее отмененные на удаление задачи
подскажите в чем может быть проблема, каждый раз нажимая кнопку удалить, затем в модальном окне нажимая кнопку ОТМЕНЫ, и после нажатия на другой задачи кнопку удалить и подтверждение операции , удаляются обе
// Создаем элемент модального окна
const modalOverlay = document.createElement('div')
modalOverlay.classList.add('modal-overlay', 'modal-overlay_hidden')
modalOverlay.innerHTML = `
<div class="delete-modal">
<h3 class="delete-modal__question">
Вы действительно хотите удалить эту задачу?
</h3>
<div class="delete-modal__buttons">
<button class="delete-modal__button delete-modal__cancel-button">
Отмена
</button>
<button class="delete-modal__button delete-modal__confirm-button">
Удалить
</button>
</div>
</div>
`;
document.body.appendChild(modalOverlay)
// Функция для открытия модального окна
function openModal() {
modalOverlay.classList.remove('modal-overlay_hidden')
}
// Функция для закрытия модального окна
function closeModal() {
modalOverlay.classList.add('modal-overlay_hidden')
}
tasksList.addEventListener('click', (event) => {
if (event.target.classList.contains('delete-button')) {
openModal()
const taskId = event.target.closest('.task-item').dataset.taskId
const confirmButton = modalOverlay.querySelector('.delete-modal__confirm-button')
const cancelButton = modalOverlay.querySelector('.delete-modal__cancel-button')
// исправление бага с удаленной задачей
confirmButton.addEventListener('click', () => {
// Находим и удаляем задачу из массива и DOM
const taskItem = document.querySelector(`[data-task-id="${taskId}"]`)
const taskItemIndex = tasks.findIndex(task => task.id === taskId)
tasks.splice(taskItemIndex, 1)
tasksList.removeChild(taskItem)
closeModal();
})
cancelButton.addEventListener('click', closeModal)
}
})
Ответы (1 шт):
Автор решения: Grundy
→ Ссылка
confirmButton.addEventListener('click'
вызывается внутри обработчика tasksList.addEventListener('click'
- это значит, что при каждом клике на кнопку удаления, кнопкам confirmButton
и cancelButton
добавляется **дополнительный обработчик.
Если открыть модельное окно 5 раз, на каждой кнопке будет по пять обработчиков, в каждом из которых, в замыкании, будет сохранены taskId
, которые будут удаляться.
Для решения нужно
- либо удалять установленный обработчик при закрытии модального окна
- либо не использовать переменные из замыкания, и вынести добавление обработчиков из
tasksList.addEventListener('click'
например:
var taskIdToDelete = undefined;
tasksList.addEventListener('click', (event) => {
if (event.target.classList.contains('delete-button')) {
openModal();
taskIdToDelete = event.target.closest('.task-item').dataset.taskId
}
}
confirmButton.addEventListener('click', () => {
// Находим и удаляем задачу из массива и DOM
const taskItem = document.querySelector(`[data-task-id="${taskIdToDelete }"]`)
const taskItemIndex = tasks.findIndex(task => task.id === taskIdToDelete )
tasks.splice(taskItemIndex, 1)
tasksList.removeChild(taskItem)
closeModal();
})