Оптимизация 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
  1. не оптимизация, а рефакторинг
  2. yesBtn.addEventListener ставится много раз; можно вынести вниз
→ Ссылка