После нажатия на кнопку формы происходит событие submit которое мы используем для того чтобы добавить дело.
todoItemForm.form.addEventListener('submit', function(e) {
/* 1-я часть */
e.preventDefault()
/* 2-я часть */
if (!todoItemForm.input.value) {
return;
}
/* 3-я часть */
let todoItem = createTodoItem(todoItemForm.input.value);
/* 4-я часть */
todoItem.doneButton.addEventListener('click', function() {
console.log('doneButton');
todoItem.item.classList.toggle('list-group-item-success');
});
todoItem.deleteButton.addEventListener('click', function() {
if (confirm('Вы уверены')) {
todoItem.item.remove();
}
});
/* 5-я часть */
todoList.append(todoItem.item);
todoItemForm.input.value = '';
})
Вызов метода preventDefault останавливает действия браузера по умолчанию. В данном случае перезагрузки страницы после нажатия на кнопку в форме не произойдет.
Помните мы в функции createTodoItemForm вернули не один элемент, а целых три? Скоро они нам пригодятся.
return {
form,
input,
button,
}
Теперь после вызова функции createTodoItemForm, нам доступен элемент <input> т.е. поле ввода для текста.
let todoItemForm = createTodoItemForm();
Сам текст из поля ввода мы можем получить с помощью свойства value. И проверить если в поле ввода ничего нет, то и ничего не делать.
if (!todoItemForm.input.value) {
return;
}
Этот небольшой код, возможно кажется вам сложным, поэтому давайте его упростим. Обе версии проверяют если в поле ввода пустая строка, но последняя гораздо проще для понимания.
if (todoItemForm.input.value === '') {
return;
}
return возвращает какое-либо значение из функции и поле него код не выполняется. Здесь ничего не возвращается, подобный прием очень часто используется, чтобы остановить выполнение следующего кода. Для понимания этого кода, можете закомментировать return и у вас появится возможность создавать дела без названия.
Получить значение поля ввода мы можем с помощию свойства value
Давайте представим что вы открыли страницу и в поле ввода ввели следующий текст "приготовить ужин". Давайте посмотрим как будет работать с этим значением код функции-обработчика события submit.
let todoItem = createTodoItem(todoItemForm.input.value);
В переменной todoItem будет содержаться следующий html.
<li class="list-group-item d-flex justify-content-between align-items-center">
приготовить ужин
<div class="btn-group btn-group-sm">
<button class="btn btn-success">Готово</button>
<button class="btn btn-danger">Удалить</button>
</div>
</li>
Несмотря на то, что эти элементы не добавлены на страницу, с ними уже можно работать.
С помощью метода addEventListener, мы добавляем функции обработчики события click, т.е. по клику на кнопку "Готово" элементу <li> из переменной todoItem.item будет добавлен новый класс list-group-item-success. Данный класс добавит стили элементу <li>. В частности добавит зеленый цвет фона.
todoItem.doneButton.addEventListener('click', function() {
todoItem.item.classList.toggle('list-group-item-success');
/* <li class="... list-group-item-success"> </li>*/
});
Само добавление класса происходит с методом toggle, который добавит класс, только если этого класса нет у этого жлемента. Если же этот класс присутствует, то он его наоборот удалит.
Для кнопки "Удалить" здесь добавляется окно подтверждения. Если ответ "ОК", то элемент удалиться с помощью метода remove.
todoItem.deleteButton.addEventListener('click', function() {
if (confirm('Вы уверены')) {
todoItem.item.remove();
}
});
Последнее что мы делаем это добавляем созданный нами элемент со всеми атрибутами, классами и функциями-обработчиками а саму страницу с помощью метода append.
todoList.append(todoItem.item);
Чтобы очистить поле ввода мы присваиваем свойству элемента value пустое значение.
todoItemForm.input.value = '';