
Этот набор заданий поможет вам попрактиковаться в манипулировании HTML DOM с помощью JavaScript для создания классического приложения - списка задач (Todo List). Вы начнете с основ: выбора элементов и добавления новых задач. Затем перейдете к более сложным вещам, таким как отметка задач как выполненных и их удаление. Каждое задание предоставляет готовый HTML и частично написанный JavaScript код, который вам нужно будет дополнить, чтобы реализовать требуемую функциональность. Это отличный способ закрепить знания по работе с событиями, созданию и изменению элементов DOM.
- Модуль 1: Основы выбора элементов
- Выбор элемента по ID.
- Выбор элементов по классу.
- Выбор элементов по тегу.
- Выбор по селектору CSS.
- Выбор по атрибуту.
- Поиск элементов внутри другого элемента.
- Поиск родительского элемента.
- Поиск соседних элементов (предыдущий, следующий).
- Поиск первого и последнего дочернего элемента.
- Поиск всех дочерних элементов.
- Модуль 2: Манипуляция содержимым
- Модуль 3: Работа с атрибутами
- Модуль 4: Управление классами
- Модуль 5: Управление стилями
- Модуль 6: Создание и удаление элементов
- Создание нового элемента.
- Вставка элемента перед другим элементом.
- Вставка элемента после другого элемента.
- Добавление элемента в определенную позицию внутри списка дочерних элементов.
- Удаление элемента из DOM.
- Замена одного элемента другим.
- Перемещение существующего элемента в другое место DOM..
- Очистка содержимого элемента без его удаления.
- Модуль 7: Обработка событий
- Модуль 8: Работа с формами
- Модуль 9: Продвинутые манипуляции
- Модуль 10: Работа с размерами и прокруткой
- Получение размеров элемента.
- Получение позиции элемента относительно окна браузера.
- Получение позиции элемента относительно родительского элемента.
- Управление прокруткой страницы.
- Определение, виден ли элемент в текущей области просмотра.
- Плавная прокрутка к элементу.
- Создание элемента, который фиксируется при прокрутке.
- Модуль 11: Работа с медиа-элементами
- Модуль 12: Практические задания
- Создание интерактивного списка задач (todo list).
- Создание простого калькулятора.
Выбор элементов для Todo List
Для начала работы с нашим списком задач нам нужно получить доступ к основным элементам на странице: полю для ввода новой задачи, кнопке для добавления задачи и списку, куда будут добавляться задачи. Ваша задача - используя JavaScript, найти эти три элемента по их ID и сохранить их в переменные.
<input type="text" id="taskInput" placeholder="Новая задача...">
<button id="addButton">Добавить</button>
<ul id="taskList"></ul>
const taskInput = document.input__1("taskInput");
const addButton = document.getElementById(input__2);
const taskList = input__3.getElementById("taskList");
// Для проверки можешь вывести элементы в консоль (не обязательно)
console.log(taskInput, addButton, taskList);
Добавление новой задачи в список
Теперь реализуем основную функцию: добавление новой задачи. При нажатии на кнопку 'Добавить' должен создаваться новый элемент списка (`<li>`), текст для него браться из поля ввода, и этот новый элемент должен добавляться в конец списка `<ul>`.
<input type="text" id="taskInput" placeholder="Новая задача...">
<button id="addButton">Добавить</button>
<ul id="taskList"></ul>
const taskInput = document.getElementById("taskInput");
const addButton = document.getElementById("addButton");
const taskList = document.getElementById("taskList");
addButton.input__1("click", function() {
const taskText = taskInput.input__2;
// Создаем новый элемент списка
const newTask = document.input__3("li");
// Устанавливаем текст задачи
newTask.input__4 = taskText;
// Добавляем задачу в список
taskList.input__5(newTask);
// Очищаем поле ввода (добавим в следующем шаге)
// taskInput.value = "";
});
Очистка поля ввода и проверка на пустую задачу
Улучшим предыдущий шаг. Во-первых, после добавления задачи поле ввода должно автоматически очищаться. Во-вторых, не нужно добавлять пустые задачи. Добавьте проверку: если поле ввода пустое (или содержит только пробелы), задача не должна добавляться.
<input type="text" id="taskInput" placeholder="Новая задача...">
<button id="addButton">Добавить</button>
<ul id="taskList"></ul>
const taskInput = document.getElementById("taskInput");
const addButton = document.getElementById("addButton");
const taskList = document.getElementById("taskList");
addButton.addEventListener("click", function() {
const taskText = taskInput.value.input__1(); // Удаляем пробелы по краям
// Проверяем, не пустая ли строка
if (taskText input__2 "") {
const newTask = document.createElement("li");
newTask.textContent = taskText;
taskList.appendChild(newTask);
// Очищаем поле ввода
taskInput.input__3 = input__4;
}
});
Отметка задачи как выполненной
Добавим интерактивности: при клике на любую задачу в списке она должна помечаться как выполненная (или наоборот, если уже была выполнена). Визуально это будет достигаться добавлением/удалением CSS-класса `completed`, который перечеркивает текст.
ul {
list-style: none;
padding: 0;
}
li {
padding: 8px;
border-bottom: 1px solid #eee;
cursor: pointer;
}
li:hover {
background-color: #f9f9f9;
}
.completed {
text-decoration: line-through;
color: #aaa;
}
<input type="text" id="taskInput" placeholder="Новая задача...">
<button id="addButton">Добавить</button>
<ul id="taskList">
<li>Пример задачи 1</li>
<li>Пример задачи 2</li>
</ul>
const taskInput = document.getElementById("taskInput");
const addButton = document.getElementById("addButton");
const taskList = document.getElementById("taskList");
// Код добавления задачи (из предыдущего шага)
addButton.addEventListener("click", function() {
const taskText = taskInput.value.trim();
if (taskText !== "") {
const newTask = document.createElement("li");
newTask.textContent = taskText;
taskList.appendChild(newTask);
taskInput.value = "";
}
});
// Обработчик для отметки выполнения
taskList.addEventListener(input__1, function(input__2) {
// Проверяем, что клик был по элементу LI
if (event.input__3.tagName === input__4) {
// Переключаем класс 'completed'
event.target.input__5.toggle("completed");
}
});
Добавление кнопки удаления для каждой задачи
Каждая задача должна иметь кнопку для ее удаления. Измените код добавления новой задачи так, чтобы вместе с текстом задачи в `<li>` добавлялся элемент (например, `<span>` или `<button>`) с текстом 'X' или символом ×, который будет служить кнопкой удаления. Добавьте этой кнопке CSS-класс `delete-btn` для стилизации и дальнейшего использования.
ul {
list-style: none;
padding: 0;
}
li {
padding: 8px;
border-bottom: 1px solid #eee;
display: flex; /* Для расположения текста и кнопки в строку */
justify-content: space-between; /* Разнести текст и кнопку по краям */
align-items: center;
}
.completed {
text-decoration: line-through;
color: #aaa;
}
.delete-btn {
color: red;
cursor: pointer;
margin-left: 10px; /* Небольшой отступ слева */
font-weight: bold;
}
.delete-btn:hover {
color: darkred;
}
<input type="text" id="taskInput" placeholder="Новая задача...">
<button id="addButton">Добавить</button>
<ul id="taskList"></ul>
const taskInput = document.getElementById("taskInput");
const addButton = document.getElementById("addButton");
const taskList = document.getElementById("taskList");
addButton.addEventListener("click", function() {
const taskText = taskInput.value.trim();
if (taskText !== "") {
const newTask = document.createElement("li");
newTask.textContent = taskText; // Устанавливаем основной текст задачи
// Создаем кнопку удаления
const deleteBtn = document.input__1("span");
deleteBtn.textContent = input__2; // Текст кнопки
deleteBtn.input__3.add(input__4); // Добавляем класс
// Добавляем кнопку внутрь li
newTask.input__5(deleteBtn);
taskList.appendChild(newTask);
taskInput.value = "";
}
});
// Обработчик для отметки выполнения (оставляем из предыдущего шага)
taskList.addEventListener("click", function(event) {
// Пока обрабатываем только клик по LI для выполнения
if (event.target.tagName === "LI") {
// Проверяем, чтобы клик не был по кнопке удаления внутри LI
if (!event.target.querySelector('.delete-btn') || !event.target.querySelector('.delete-btn').contains(event.target)) {
event.target.classList.toggle("completed");
}
}
});
Реализация удаления задачи
Завершающий шаг: сделаем кнопку удаления рабочей. Используя делегирование событий на списке `taskList`, определите, был ли клик по элементу с классом `delete-btn`. Если да, то нужно найти родительский элемент `<li>` этой кнопки и удалить его из DOM.
ul {
list-style: none;
padding: 0;
}
li {
padding: 8px;
border-bottom: 1px solid #eee;
display: flex;
justify-content: space-between;
align-items: center;
}
li span:first-child {
cursor: pointer; /* Делаем текст задачи кликабельным для выполнения */
flex-grow: 1; /* Позволяем тексту занимать доступное место */
margin-right: 10px;
}
.completed span:first-child {
text-decoration: line-through;
color: #aaa;
}
.delete-btn {
color: red;
cursor: pointer;
font-weight: bold;
padding: 0 5px; /* Небольшие отступы для кнопки */
}
.delete-btn:hover {
color: darkred;
}
<!-- Изменим структуру LI, чтобы текст был в отдельном span для корректной работы клика -->
<input type="text" id="taskInput" placeholder="Новая задача...">
<button id="addButton">Добавить</button>
<ul id="taskList">
<li><span>Пример задачи 1</span><span class="delete-btn">×</span></li>
<li><span>Пример задачи 2</span><span class="delete-btn">×</span></li>
</ul>
const taskInput = document.getElementById("taskInput");
const addButton = document.getElementById("addButton");
const taskList = document.getElementById("taskList");
// Код добавления задачи с кнопкой удаления
addButton.addEventListener("click", function() {
const taskText = taskInput.value.trim();
if (taskText !== "") {
const newTask = document.createElement("li");
// Создаем span для текста задачи
const taskTextSpan = document.createElement('span');
taskTextSpan.textContent = taskText;
newTask.appendChild(taskTextSpan);
// Создаем кнопку удаления
const deleteBtn = document.createElement("span");
deleteBtn.textContent = " × ";
deleteBtn.classList.add("delete-btn");
newTask.appendChild(deleteBtn);
taskList.appendChild(newTask);
taskInput.value = "";
}
});
// Общий обработчик кликов на списке
taskList.addEventListener("click", function(event) {
// Проверка клика по кнопке удаления
if (event.target.input__1.input__2("delete-btn")) {
const taskItem = event.target.input__3; // Получаем родительский LI
taskItem.input__4(); // Удаляем LI
}
// Проверка клика по тексту задачи для выполнения (кликаем на SPAN внутри LI)
else if (event.target.tagName === "SPAN" && !event.target.classList.contains("delete-btn")) {
// Применяем класс к родительскому LI
event.target.parentElement.classList.toggle("completed");
}
});