Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.04.2022, 11:47
Интересующийся
Отправить личное сообщение для bizunowvova Посмотреть профиль Найти все сообщения от bizunowvova
 
Регистрация: 18.04.2022
Сообщений: 15

Отслеживание количества активных задач в ToDo
Все привет! Пишу первую Тудушку свою, хочу обзавестись функцией отслеживания активных задач. Добился того, что считает количество новых задач, но не обновляется при удалении. Понимаю, что из todoAdd переменную не видит в listenDeleteTodo, но ничего не могу придумать, что бы решить эту проблему.....Помогите наладить этот процесс)
'use strict';

function ToDo() {
    const input = document.querySelector("input.title");
    const addBtn = document.querySelector("button.add");
    const ul = document.querySelector("ul.todos");
    const clearButton = document.querySelector("button.clear");
    const allTasks = document.querySelector('#p1')
    const activeTasks = document.querySelector('#p2')
    let tasks = [];

    ul.addEventListener("click", onClickTodo);
    
    ul.querySelectorAll('li').forEach(n => {
        listenDeleteTodo(n.querySelector('.todo-trash'), n)});

    clearButton.addEventListener("click", () => {
        ul.innerHTML = "";
        localStorage.removeItem('todos', ul.innerHTML);
    });
    
    // for(let i=0; i < document.querySelectorAll('li').length; i++) {
    //     allTasks.innerHTML = `Всего задач: ${[i]}`;
    // }
    
    function todoAdd() {
        const li = document.createElement('li');
        const textSpan = document.createElement("span");
        textSpan.classList.add("todo-text");
        const newTodo = input.value;
        textSpan.append(newTodo);

        const deleteButton = document.createElement('span');
        deleteButton.classList.add("todo-trash");
        const button = document.createElement("button");
        button.type = 'text';
        button.classList.add("trash");
        deleteButton.appendChild(button);
        
        let list = document.querySelectorAll('ul.todos > li');
        tasks.push(list);
        allTask();
        
        ul.appendChild(li).append(textSpan, deleteButton);
        input.value = "";
        listenDeleteTodo(deleteButton, li);
    }
    function onClickTodo(event) {
        if (event.target.tagName === "LI" || 'text') {
            event.target.classList.toggle("checked");
        }
    }

    addBtn.addEventListener('click', () => {
        if (input.value.trim().length) {
            todoAdd();
        } 
    })
    input.addEventListener('keydown', (e) => {
        if(input.value.trim().length && e.keyCode === 13) {
            todoAdd();
        }
    })

    function listenDeleteTodo(button, i) {
        button.addEventListener("click", () => {
            i.remove();
            console.log('remove');
            tasks.splice(tasks.indexOf(list), 1 );
            allTask();
        });
    }
    
    function allTask() { 
        let count = tasks.length;
        allTasks.textContent = `Всего задач: ${[count]}`;
    }
}
document.addEventListener("DOMContentLoaded", ToDo);

<!DOCTYPE html>
<html>
    <head>
        <title>Приложение To-Do List</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="index.css">
    </head>
    <body>
        <div id="todo">
            <h1>Мой список дел</h1>
            <p1 id="p1">Всего задач:</p1>
            <p2 id="p2">Задач активно:</p2>
            <input type="text" placeholder="Добавить список" class="title">
            <button type="text" class="add">Добавить</button>
            <ul class="todos">
                <li>
                    <span calss="todo-text">
                            Прикрутить добавление по ентер
                    </span>
                    <span class="todo-trash">
                        <button class="trash" type="text"></button>
                    </span>
                </li>
                <li>
                    <span calss="todo-text">
                            Добавить кнопку к инпут
                    </span>
                    <span class="todo-trash">
                        <button class="trash" type="text"></button>
                    </span>
                </li>
            </ul>
            <div id="buttons">
                <button class="clear">Очистить</button>
            </div>
        </div>
        <script type="text/javascript" src="index.js"> </script>
    </body>
</html>

Код:
button.trash::after {
    content: "Del";
}

button.trash {
    background-color: none;
    border: none;
    color: gray;
    padding: 8px;
    text-align: center;
    text-decoration: none;
    display: inline-block;
    font-size: 11px;
    border-radius: 50%;
}

.todos li {
    cursor: pointer;
    font-size: 15px;
    padding:  3px 0px;
}

.checked {
    color: gray;
    text-decoration: line-through;
}

.todos li span.todo-text {
    padding:  10px 0px;
}

#todo {
    margin: 0 auto;
    max-width: 300px;
    height: 100%;
    background: white;
    position: relative;
}
Ответить с цитированием
  #2 (permalink)  
Старый 24.04.2022, 13:37
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

bizunowvova,
<!DOCTYPE html>
<html>

<head>
    <title>Приложение To-Do List</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style type="text/css">
        button.trash::after {
            content: "Del";
        }

        button.trash {
            background-color: none;
            border: none;
            color: gray;
            padding: 8px;
            text-align: center;
            text-decoration: none;
            display: inline-block;
            font-size: 11px;
            border-radius: 50%;
        }

        .todos li {
            cursor: pointer;
            font-size: 15px;
            padding: 3px 0px;
        }

        .checked {
            color: gray;
            text-decoration: line-through;
        }

        .todos li span.todo-text {
            padding: 10px 0px;
        }

        #todo {
            margin: 0 auto;
            max-width: 300px;
            height: 100%;
            background: white;
            position: relative;
        }
    </style>
</head>

<body>
    <div id="todo">
        <h1>Мой список дел</h1>
        <p1 id="p1">Всего задач:</p1>
        <p2 id="p2">Задач активно:</p2>
        <input type="text" placeholder="Добавить список" class="title">
        <button type="text" class="add">Добавить</button>
        <ul class="todos">
            <li>
                <span calss="todo-text">
                            Прикрутить добавление по ентер
                    </span>
                <span class="todo-trash">
                        <button class="trash" type="text"></button>
                    </span>
            </li>
            <li>
                <span calss="todo-text">
                            Добавить кнопку к инпут
                    </span>
                <span class="todo-trash">
                        <button class="trash" type="text"></button>
                    </span>
            </li>
        </ul>
        <div id="buttons">
            <button class="clear">Очистить</button>
        </div>
    </div>
    <script>
        'use strict';

        function ToDo() {
            const input = document.querySelector("input.title");
            const addBtn = document.querySelector("button.add");
            const ul = document.querySelector("ul.todos");
            const clearButton = document.querySelector("button.clear");
            const allTasks = document.querySelector('#p1')
            const activeTasks = document.querySelector('#p2')
            let tasks = [];

            ul.addEventListener("click", onClickTodo);

            ul.querySelectorAll('li').forEach(n => {
                listenDeleteTodo(n.querySelector('.todo-trash'), n)
            });

            clearButton.addEventListener("click", () => {
                ul.innerHTML = "";
                localStorage.removeItem('todos', ul.innerHTML);
                tasks.length = 0;
                allTask();
            });

            function todoAdd() {
                const li = document.createElement('li');
                const textSpan = document.createElement("span");
                textSpan.classList.add("todo-text");
                const newTodo = input.value;
                textSpan.append(newTodo);

                const deleteButton = document.createElement('span');
                deleteButton.classList.add("todo-trash");
                const button = document.createElement("button");
                button.type = 'text';
                button.classList.add("trash");
                deleteButton.appendChild(button);

                tasks.push(li);
                allTask();

                ul.appendChild(li).append(textSpan, deleteButton);
                input.value = "";
                input.focus();
                listenDeleteTodo(deleteButton, li);
            }

            function onClickTodo(event) {
                let target = event.target.closest("LI");
                if (target) {
                    target.classList.toggle("checked");
                    allTask();
                }
            }

            addBtn.addEventListener('click', () => {
                if (input.value.trim().length) {
                    todoAdd();
                }
            })
            input.addEventListener('keydown', (e) => {
                if (input.value.trim().length && e.keyCode === 13) {
                    todoAdd();
                }
            })

            function listenDeleteTodo(button, i) {
                button.addEventListener("click", (event) => {
                    event.preventDefault();
                    i.remove();
                    console.log('remove');
                    tasks.splice(tasks.indexOf(i), 1);
                    allTask();
                });
            }

            function allTask() {
                let count = tasks.length;
                let checked = tasks.filter(li => li.classList.contains('checked')).length
                allTasks.textContent = `Всего задач: ${count}`;
                activeTasks.textContent = `Задач активно: ${count - checked}`;
            }

            let list = document.querySelectorAll('ul.todos > li');
            tasks.push(...list);
            allTask();
        }
        document.addEventListener("DOMContentLoaded", ToDo);
    </script>
</body>

</html>

Последний раз редактировалось рони, 24.04.2022 в 16:48.
Ответить с цитированием
  #3 (permalink)  
Старый 24.04.2022, 16:22
Интересующийся
Отправить личное сообщение для bizunowvova Посмотреть профиль Найти все сообщения от bizunowvova
 
Регистрация: 18.04.2022
Сообщений: 15

рони,
спасибо! Немножко некорректно работает список активных задач теперь после чекеда, но постараюсь обдумать все сам)
Ответить с цитированием
  #4 (permalink)  
Старый 24.04.2022, 16:34
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Сообщение от bizunowvova
Немножко некорректно работает список активных задач теперь после чекеда,
что не так?
Ответить с цитированием
  #5 (permalink)  
Старый 24.04.2022, 16:44
Интересующийся
Отправить личное сообщение для bizunowvova Посмотреть профиль Найти все сообщения от bizunowvova
 
Регистрация: 18.04.2022
Сообщений: 15

Сообщение от рони Посмотреть сообщение
что не так?
Щас поюзал, даже не после чекеда это начинается.
Если создать большой список задач (8-10 пунктов) и удалять начиная не с последнего в списке, то активных задач становится на две меньше, вместо одной. Так же, если не добавлять задачи, а пользоваться только двумя стоковыми, то при удалении первой происходит аналогичная ситуация и активных задачи становится 0, когда должна быть одна.
Ответить с цитированием
  #6 (permalink)  
Старый 24.04.2022, 16:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

bizunowvova,
пост #2 строка 150 исправлена.
Ответить с цитированием
  #7 (permalink)  
Старый 24.04.2022, 16:56
Интересующийся
Отправить личное сообщение для bizunowvova Посмотреть профиль Найти все сообщения от bizunowvova
 
Регистрация: 18.04.2022
Сообщений: 15

Сообщение от рони Посмотреть сообщение
bizunowvova,
пост #2 строка 150 исправлена.
Спасибо! Все отлично работает)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Напишите простое ToDo App — список задач melnikov24 Общие вопросы Javascript 3 12.02.2020 05:29