Оптимизация toDo App
Написал учебный "Список дел", в рамках задания появилась задача-оптимизировать его, убрав повторяющийся код и разделив на отдельные функции(создание элемента списка, показ конфирма в случае ввода записи, которая уже есть). Разделить на функции удалось, но теперь при вводе существующей записи и согласии на её добавление она добавится лишь один раз, при следующей итерации кнопка "Да, все равно добавить" не работает. Код, который я сократил-закомментирован.
let task = document.querySelector('.inputName').value;
const addBtn = document.getElementById('addBtn');
const toDoList = document.querySelector('.toDoList');
const alertList = document.querySelector('.alert');
const formToDo = document.querySelector('.formToDo');
const yesBtn = document.getElementById('Yes');
const noBtn = document.getElementById('No');
function addToList () {
task = document.querySelector('.inputName').value;
if (task === '') {
alert('Напишите что-нибудь!');
} else {
let alerts = true;
let elementChildrens = toDoList.children;
for (let i = 0, child; child = elementChildrens[i]; i++) {
if (task === child.textContent) {
alerts = false;
break;
}
}
function toggleHiden () {
alertList.style.display = (alertList.style.display == 'block') ? 'none' : 'block';
formToDo.style.display = (formToDo.style.display == 'none') ? 'block' : 'none';
toDoList.style.display = (toDoList.style.display == 'none') ? 'block' : 'none';
}
function createLi () {
let l1 = document.createElement('li');
l1.innerHTML = '<li></li>';
l1.classList.add('toDo');
l1.textContent = task;
toDoList.appendChild(l1);
document.querySelector('.inputName').value = '';
}
if (alerts) {
createLi();
// let l1 = document.createElement('li');
// l1.innerHTML = '<li></li>';
// l1.classList.add('toDo');
// l1.textContent = task;
// toDoList.appendChild(l1);
// document.querySelector('.inputName').value = '';
} else {
toggleHiden();
// alertList.classList.remove('hiden');
// formToDo.classList.add('hiden');
// toDoList.classList.add('hiden');
yesBtn.addEventListener('click', toggleHiden)
// alertList.classList.add('hiden');
// formToDo.classList.remove('hiden');
// toDoList.classList.remove('hiden');
// let l1 = document.createElement('li');
// l1.innerHTML = '<li></li>';
// l1.classList.add('toDo');
// l1.textContent = task;
// toDoList.appendChild(l1);
// document.querySelector('.inputName').value = '';
createLi();
noBtn.addEventListener('click', toggleHiden)
// alertList.classList.add('hiden');
// formToDo.classList.remove('hiden');
// toDoList.classList.remove('hiden');
document.querySelector('.inputName').value = '';
}
}
}
let through = function (ev) {
ev.target.classList.toggle('through');
}
addBtn.addEventListener('click', addToList);
toDoList.addEventListener('click', through);
html,
body {
padding: 0;
min-width: 1000px;
font-family: Arial;
background-color: #f9f9f9 !important;
}
.container {
position: relative;
}
.wrapper {
display: flex;
justify-content: center;
}
.formToDo {
margin: 100px;
flex: 0 0 50%;
padding: 0 40px 40px;
display: flex;
flex-direction: column;
background-color: rgba(255, 255, 255, 0.85);
background-clip: padding-box;
border: 1px solid rgba(0, 0, 0, 0.1);
box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);
border-radius: 0.25rem;
}
.heading {
padding: 25px 25px;
text-align: center;
font-size: 30px;
}
.hiden {
display: none;
}
.through {
background: #888;
text-decoration: line-through;
}
.toDo {
padding: 5px 0;
cursor: pointer;
background: #eee;
transition: 0.2s;
}
.toDoList {
padding-left: 15px;
}
.inputName {
width: 100%;
margin-bottom: 30px;
}
/* Установить все нечетные элементы списка в другой цвет (зебра) */
.toDo:nth-child(odd) {
background: #f9f9f9;
}
/* Более темный фон-цвет при наведении */
.toDo:hover {
background: #ddd;
}
.btn {
align-self: flex-end;
}
.alert {
margin-top: 250px;
padding: 25px;
background-color: rgba(255, 255, 255, 0.85);
background-clip: padding-box;
border: 1px solid rgba(0, 0, 0, 0.1);
box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);
border-radius: 0.25rem;
}
.close {
padding-right: 10px;
}
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Список дел</title>
<link rel="stylesheet" href="styles.css" />
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"
integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous" />
<script src="script.js" defer></script>
</head>
<body>
<div class="container">
<div class="wrapper">
<div class="formToDo">
<h1 class="heading">Мой список дел:</h1>
<input type="text" class="inputName form-control" placeholder="Напишите..." />
<ol class="toDoList">
<li class="toDo">Сходить в магазин</li>
<li class="toDo">Приготовить ужин</li>
</ol>
<button type="submit" id="addBtn" class="btn btn-primary">Добавить</button>
</div>
<div class="alert hiden">
Такая запись уже есть. Всё равно добавить?
<button id="Yes" class="btn btn-success">Да</button>
<button id="No" class="btn btn-danger">Нет</button>
</div>
</div>
</div>
</body>
</html>
Ответы (1 шт):
Автор решения: Sergei Kirjanov
→ Ссылка
- не оптимизация, а рефакторинг
yesBtn.addEventListenerставится много раз; можно вынести вниз