JavaScript: DOM и события
Цель: изучить DOM, события и их обработку, взаимосвязь и способы манипуляций с объектами дерева.
Подготовка
DOM
DOM как внутреннее представление браузером HTML-структуры документа в виде иерархии объектов, которыми можно манипулировать с помощью JavaScript.
Корневой, родительские, дочерние, одноуровневые узлы DOM, которые существуют относительно друг друга.
Navigator, Window и Document - важные части веб-браузера и то, как они представлены в JavaScript.
Получение ссылок на узлы DOM, например, с помощью querySelector() и getElementById().
Создание новых узлов, например, с помощью innerHTML() и createElement().
Добавление и удаление узлов в DOM с помощью appendChild() и removeChild().
Добавление атрибутов с помощью setAttribute() и редактирование текстового содержимого объектов.
Манипулирование стилями с помощью Element.style._ и Element.classList._.
События
События — это сигналы, испускаемые браузером, когда происходит что-то важное, в ответ на которые разработчик может выполнить некоторый код.
Работа с обработчиками событий: addEventListener() и removeEventListener(), опции обработчика событий. Объекты событий.
Предотвращение поведения по умолчанию с помощью preventDefault().
Делегирование обработки событий благодаря всплытию.
Источники
- doka.guide - DOM
- doka.guide - Событийная модель
- DOM Scripting
- doka.guide - canvas
- Canvas API
- Классы DOM-узлов
- UIEvent
Выполнение
Установка и настройка ESLint
- Установить node.js четной версии.
- Переключиться на ветку main.
- Инициализировать пакет с помощью команды
npm init -y. - Установить ESLint с помощью
npm init @eslint/config. Подсказки как отвечать на вопросы при установке:- What do you want to lint? - javascript
- How would you like to use ESLint? - To check syntax and find problems
- What type of modules does your project use? - JavaScript modules (import/export)
- Which framework does your project use? - None of these
- Does your project use TypeScript? - No
- Where does your code run? - Browser
- Would you like to install them now? - yes
- Which package manager do you want to use? - npm
- В файл
eslint.config.mjsдобавить правила приведенные ниже. Пример организации конфигурационного файла смотрите в документации ESLint. - По желанию установить расширение ESLint в VS Code или аналогичное для вашего редактора.
- Добавить в проект файл
.gitignore. В него добавитьnode_modules/. - Создать коммит на ветке main со всеми новыми файлами. Убедитесь, что папка node_modules и ее содержимое не попадают в коммит.
Правила для ESLint в конфигурацию eslint.config.mjs
{
rules: {
// Possible Problems
"no-template-curly-in-string": "error",
"no-use-before-define": ["error", { functions: false }],
"no-useless-assignment": "error",
// Suggestions
"accessor-pairs": "error",
"arrow-body-style": ["error", "as-needed"],
camelcase: "error",
curly: "error",
eqeqeq: ["error", "always"],
"no-alert": "error",
"no-console": "error",
"no-nested-ternary": "error",
"no-return-assign": "error",
"no-shadow": ["error", { hoist: "all" }],
"no-unneeded-ternary": "error",
"no-unused-expressions": "error",
"no-useless-concat": "error",
"no-useless-return": "error",
"no-var": "error",
"prefer-arrow-callback": "error",
"prefer-const": "error",
"prefer-template": "error",
radix: "error",
},
}
Решение задач
Проверьте что вы находитесь на ветке main и ESLint настроен. После этого создайте ветку lab2. На ней добавьте документ html с H1 заголовком «ФИО - Лабораторная работа №2» в header.
Выполните задачи, разместив элементы интерфейса для них в отдельных секциях с соответствующими подзаголовками.
Обязательно проведите ручное тестирование в браузере. Перед созданием коммитов проверяйте код с помощью ESLint и форматируйте его.
Зафиксируйте результаты работы с помощью системы контроля версий git и отправить ветку lab2 в репозиторий на github.
Требования
- Все задачи имеют решение и требуемый в них вид и вывод.
- Весь код отформатирован.
- Отсутствуют ошибки ESLint.
- Отсутствуют ошибки в консоли браузера при работе с веб-страницей.
- Отсутствуют анонимные функции при использовании метода .addEventListener().
- Текст в интерфейсе русский.
Задачи
Like
Реализовать кнопку с иконкой пальца вверх или сердечка (не забывайте про доступность и текст). При нажатии на эту кнопку она помечается как активированная. При повторном нажатии она становится деактивированной.
Like / Dislike
Повторите кнопку из прошлого задания, но добавьте вторую с иконкой пальца вниз или разбитого сердечка. Теперь при нажатии на одну из них она помечается как активированная, при повторном - деактивированной. Но они не могут быть активны одновременно. По-прежнему не забывайте про доступность и текст.
Корзина
Сделайте несколько простых карточек с изображением, описанием и кнопкой “в корзину”. Также добавьте иконку корзины со счетчиком товаров (span) в header. Счетчик должен быть размещен в правом верхнем углу иконки. При нажатии на кнопку “в корзину” счетчик корзины увеличивается на 1.
Сортировка
Добавьте три кнопки для сортировки по возрастанию, убыванию и возврату к исходному варианту. В js создайте массив со случайными числами (можно использовать функции из прошлой работы). Список (<ul>, <li>) для отображения чисел должен создаваться с помощью js (не использовать innerHTML). При нажатии на одну из кнопок сортировки на страницы обновляется отображение списка.
Галерея
Добавьте на страницу 10 фотографий и две кнопки: перенести и удалить. Пользователь может перейти в режим выбора продолжительным (1 секунда) нажатием на изображение, оно выбирается и помечается цифрой с порядковым номером 1. Пользователь может еще раз нажать на это же изображение, цифра снимается и режим выбора завершается. В режиме выбора пользователь может выбирать другие фото по обычному нажатию и к изображениям добавляется порядковый номер в выборе. Порядковые номера ставятся там где произошло нажатие. Все выбранные изображения можно удалить или перенести в подраздел скопированные, где они располагаются в том порядке, котором были выбраны. Кнопки перенести и удалить активны только в режиме выбора.