Программирование на JavaScript позволяет разработчикам достаточно выучить синтаксис, но на практике им пользоваться не всегда легко. В процессе углубления в коддинг предстоит иметь дело с разнообразными элементами и возможностями. Пример – события.
Соответствующие «объекты» находятся на слуху и активно встречаются в обыденной жизни человека. Программирование тоже предлагает работу с событиями. В данном случае кодификация находится под управлением так называемых Events. Браузер будет генерировать происшествие, когда с документами или их элементами что-либо происходит.
Термины
Помимо стандартной терминологии программирования, чтобы работать с рассматриваемым компонентом, необходимо запомнить дополнительно следующую информацию:
- Тип событий – строка, которая отвечает за определение типа манипуляций, повлекшей за собой то или иное происшествие.
- Цель – объект, в котором возникает событие. Может выступать элементом, связанным с происшествием.
- Обработчики событий – функции, предназначенные для обработки или отклика на возникшее происшествие.
- Объект – элемент, который связан с событием и содержит данные об оном.
Перечисленные термины и понятия помогут лучше ориентироваться в выбранном направлении. Для реализации поставленной задачи достаточно базовых знаний работы с HTML и JS.
Определение
Событие – то, что происходит в процессе выполнения определенных действий. Своеобразная возможность взаимодействия. Пользователь так получает право работать с открытой в интернет-обозревателе странице.
Пример – нажатие на клавишу с целью внесения тех или иных корректировок. Клиент нажимает сочетание ctrl +, чтобы увеличить масштаб отображаемой страницы.
Принципы объявления
В данной статье будут рассмотрены основы работы с элементами событий. Оные могут быть объявлены несколькими способами:
- методами;
- функцией addEventListener();
- посредством HTML атрибутов.
Каждый прием предусматривает собственные преимущества и недостатки. Пока разработчик не определился с возможным подходом, лучше изучить их все.
Встроенный обработчик
Самый простой вариант развития событий, который можно использовать на практике – это встроенный обработчик рассматриваемых «элементов». В основе него лежат HTML атрибуты:
Сегодня к помощи подобного приема практически не прибегают. Встречается метод в некоторых фреймворках.
Методы в помощь
Существует много вариантов работы с элементами Events. Более интересный прием – это реализация при помощи так называемых методов. Он встречается на практике довольно часто. Работать таким образом должен уметь каждый программер.
Выше приведен пример реализации событий путем задействования специальных методов. Ключевой особенностью здесь является то, что рассматриваемый пример поддерживает вложенность.
Популярные методы
Любой уважающий себя программер, работающий с Events, должен изучить имеющиеся методы оных:
- onclick — кликанье курсором мышки;
- oncontextmenu – правая кнопка мыши, нажатие;
- onmousemove – перемещение курсора на задействованном элементе страницы;
- onmouseup – смещение курсора вниз;
- onmousedown – нажатие на кнопку, имеющейся на мышке;
- onkeydown – щелканье по клавише;
- onkeyup – опускание клавиши;
- onkeypress – зажатие имеющегося элемента управления.
Это далеко не все методы. Они просто встречаются на практике чаще остальных. Без них код составить весьма проблематично.
Функция AddEventListener – предельное удобство
Это – наиболее простое решение, если хотим воспользоваться событиями в JS. Метод AddEventListener выглядит на примере так:
Стоит рассмотреть функцию, которая будет добавлять обработчик событий. У нее имеются два параметра:
- название события;
- непосредственно работающая функция, активирующаяся при срабатывании event.
Удалить ранее добавленный обработчик можно через removeEventListener:
Какие методы используются
Можно использовать следующие «элементы» для создания events:
- click – щелчок мышкой;
- mouseup – что происходит, когда кнопка мыши отпускается;
- mousedown – нажатие на кнопку мыши;
- mousemove – перемещение курсора на используемом элементе;
- contextmenu – клик ПКМ;
- kedown – щелканье по клавише;
- keyup – отпускание имеющейся клавиши;
- keypress – зажатие.
Данные методы почти такие же, как и в предыдущем варианте, но без своеобразной характерной приставки on.
О свойствах обработчика событий
Программирование на JS предоставляет немало способов добавления кодов обработчиков событий на имеющиеся веб-странички. У упомянутых элементов имеются различные свойства. Рассмотрим их на примере кода:
Здесь onclick выступает в качестве свойства обработчика событий. Относится к так называемому особому типу. При установки оного равным тому или иному коду, соответствующий элемент будет запущен, если event произойдет.
Чтобы добиться аналогичного результата, можно присвоить свойству обработчика имя функции, описанной ранее:
Эксперименты со свойствами
На основе предложенного выше примера можно «поиграть», меняя свойство events. Данная ссылка подскажет, как создать копию файла для дальнейшего применения. Document отвечает за случайные цвета.
Измените btn.onclick на предложенные далее значения, а далее смотрите, что произошло в том или ином случае:
- Onfocus и onlblur. Цвет будет корректироваться, когда кнопка сфокусируется или не сфокусирована соответственно. Свойство применяется при отображении информации для заполнения полей форм. Если фокусировка отсутствует – для отображения сообщения об ошибке. Аналогичные действия происходят, когда данные введены неверно.
- Onblclick – изменения осуществляются при условии двойного щелчка.
- Window.onkeypress/onkeydown/onkeyup – событие срабатывает, если произойдет нажатие той или иной клавиши на клавиатуре. Keypress сошлется на обычный клик, keydown и keyup разделят операцию на нажатие и отпускание элемента управления. Если обработчик событий регистрируется на самой кнопке, применяется объект window. Это – все окно используемого клиентом браузера.
- Onmouseover и onmouseout – корректировка цвета, если курсор наведен на кнопку или отведен от нее соответственно.
Некоторые события выступают в качестве универсальных. Их можно применять практически в любом элементе кода. Пример – onclick, который регистрируется для любого имеющегося объекта. Лишь некоторые ивенты обладают конкретизацией, а также задействуются в узконаправленных ситуациях. Пример – onplay для элементов <video>.
Выбор оптимального механизма
Для того, чтобы получить контент максимально функциональный и быстрый, требуется грамотно использовать функциональные возможности языка. В случае с JS и ивентами получить предельную работоспособность удается, если выбрать грамотный механизм реализации.
Из предложенных ранее метод рекомендуется избегать встроенных атрибутов событий HTML. Данная практика является устаревшей. Оставшиеся два подхода считаются взаимозаменяемыми, особенно если речь идет о простейших манипуляциях:
- Свойства одного обработчика событий обладают меньшей мощностью и параметрами, но лучше обеспечивают совместимость с браузерами. Данный момент рекомендуется учитывать на первых порах обучения.
- События уровня 2 DOM обладают большей мощностью. Могут доставить определенные хлопоты из-за усложненной структуры. Обладают худшей поддержкой.
Через функции EventListener() можно при желании удалить код обработчика или создать новый элемент.
Несколько слов об объектах событий
Внутри функций обработчика иногда встречается параметр, который задается именем event или e. Это объект события. Передается обработчикам событий автоматически. Это необходимо для обеспечения дополнительных функций и данных. Вот наглядный пример:
Здесь происходит следующее:
- Объект события e включается в функцию.
- В функции осуществляется настройка стилистики фона для e.target. Это кнопка.
- Свойство объекта события target – это всегда ссылка на элемент, где осуществилось то или иное происшествие.
Предложенный пример событие всплывает относительно случайного цвета фона на кнопке, а не на всей странице сразу.
e.target применяется тогда, когда возникает необходимость в установке одного и того же обработчика событий на несколько элементов. Также важно, чтобы на них происходило происшествие сразу ко всем «объектам». Пример – есть набор из 20 плиток, которые, если нажали на кнопку, исчезнут «одним махом».
Поведение по умолчанию – предотвращение
Бывает так, что нужно оставить событие, которое выполняет действия, предусматриваемые коддингом «по умолчанию». Пример – веб-форма регистрационного характера. При вводе данных и нажатии кнопки отправки собранные материалы отправляются на установленную страничку сервера, чтобы обработать оные. Браузер окажется перенаправленным на страницу с сообщением об успешной регистрации.
Но при регистрации можно допустить ошибку. В этом случае требуется:
- остановить отправку информации на сервер;
- показать пользователю сообщение об ошибке;
- указать на допущенные неточности для корректировки.
Некоторые браузеры поддерживают автоматическую проверку данных форм, но полагаться на их работоспособность не стоит. Вот форма, в которой вводят фамилию и имя:
А так выглядит реализация простейшей проверки внутри обработчика события onsubmit. Отвечает за проверку на пустоту текстовых полей. Если это так, происходит вызов функции preventDefault() объекта события. Она отвечает за остановку отправки формы. Далее на экране появится сообщение об ошибке.
Предложенная проверка форма является слабой, но это не мешает разобраться в принципах работы.
Всплытие и перехват
Данные события встречаются не слишком часто, но они могут стать настоящей головной болью. Речь идет о механизмах всплытия и перехвата. Отвечают за описание, когда два обработчика одного и того же события активируются в пределах одного элемента.
Чтобы лучше разобраться в теме, стоит взглянуть на наглядный пример с исходным кодом. Оба – в отдельных браузерных вкладках. Он помогает разобраться с показом и сокрытием <div> с элементом <video> внутри оного:
Здесь происходит следующее:
- Осуществляется нажатие на кнопку.
- Атрибут класса элемента <div> корректируется на showing.
- Добавляются обработчики событий onclick. Один – к div, другой – к video. Посредством использования указателя мыши при щелчке по области div вне зоны видео поле скрывается. Если действие осуществляется в пределах «ограниченной области» — видео воспроизводится.
Тут возникает проблема – если нажать на видео, оно будет производиться, одновременно скрывая div. Такое поведение связано с тем, что ролик находится внутри div и выступает его частью. Осуществляется запуск нескольких обработчиков событий.
Концепция функционирования
При инициировании события элементом с родительскими компонентами браузеры работают в два этапа. А именно – захват и всплытие.
При захвате осуществляется следующее:
- Обозреватель проводит проверку, обладает ли внешний элемент <html> обработчик события onclick, который регистрируется при захвате. Если это так, происходит запуск оного.
- Осуществляется переход к следующему элементу внутри <html>.
- Выполняются действия, описанные на первом шаге. Это происходит до тех пор, пока приложение не дойдет до объекта, на который на самом деле щелкнули.
При всплытии имеет место противоположность:
- Браузер проверяет, есть ли onclick на нажатом элементе.
- Происходит запуск оного, если обнаружено соответствие.
- Переход к следующему родительскому элементу с последующей проверкой. Происходит это до тех пор, пока не будет достигнут элемент <html>.
Нынешние браузеры изначально регистрируют обработчики на фазе всплытия.
Исправление проблем
Для корректировки проблем, связанных с регистрацией, а также всплытием и захватом можно использовать стандартный объект stopSPropagation. При вызове в обработчике событий объекта делает так, чтобы обработчик выполнялся, но event не всплывало далее по цепочки. Это значит, что другие обработчики не запустятся.
В рассмотренном примере возникшую проблему можно решить, изменив вторую строку на:
Но есть и еще один довольно важный механизм. Он называется «делегирование».
О делегировании
Делегирование событий в языке JS позволяет правильно работать с родительскими элементами. Дочерние отдельно друг от друга не обрабатываются при подобных обстоятельствах. Каждый новый элемент, добавленный в родительский блок, будет автоматически наследовать характерные события.
Вот пример, где теги li – это дочерние теги ul. Работа осуществляется со всеми li:
Сначала требуется:
- обеспечить данные для работы;
- родитель получается из метода querySelector;
- дети – через querySelectorAll;
- первый метод получит один элемент, для группы одинаковых «объектов» применяется второй вариант.
Далее подключается обработчик addEventListener на родителя. Первый параметр – передача события клика. Второй параметр – callback функция с передаваемым объектом события, чтобы свойства объекта вызывались внутри. Завершающий этап – вывод на консоль.
Свойства выводятся в консоль при клике по имеющемуся списку. Цепочка выглядит так:
- событие мышки;
- цель;
- имя тега.
Требуется узнать, куда щелкнул пользователь. Если по списку – происходит выполнение действия.
Если цель события клика event случит тег LI, в консоли возникает надпись «Привет!». В первой части условия ивент.таргет проводится проверка, есть ли у объекта события свойство target. Во второй части после оператора AND проводится удостоверение в том, что был проведен клик по тегу li.
Делегирование требуется тогда, когда на страничке много элементов, работающих с одним и тем же обработчиком событий. А чтобы такие понятия как события, input type и так далее не доставляли хлопот, стоит пройти специализированные дистанционные курсы. Есть предложения для новичков и опытных программеров. Рассчитаны курсы на срок до 12 месяцев. Можно изучить JS с нуля!
<!DOCTYPE html>
<html dir="ltr" lang="ru-RU">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<title>JavaScript и события OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="Программирование на JavaScript позволяет разработчикам достаточно выучить синтаксис, но на практике им пользоваться не всегда легко. В процессе углубления в коддинг предстоит иметь дело с разнообразными элементами и возможностями. Пример – события. Соответствующие «объекты» находятся на слуху и активно встречаются в обыденной жизни человека. Программирование тоже предлагает работу с событиями. В данном случае кодификация находится" />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/javascript-i-sobytiya/" />
<meta name="generator" content="All in One SEO (AIOSEO) 4.5.2.1" />
<script type="application/ld+json" class="aioseo-schema">
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/otus.ru\/journal\/javascript-i-sobytiya\/#article","name":"JavaScript \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f OTUS","headline":"JavaScript \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f","author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2022\/02\/oj-1080x720-5.png","width":1080,"height":720},"datePublished":"2022-02-03T18:56:54+00:00","dateModified":"2022-02-03T18:56:57+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/javascript-i-sobytiya\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/javascript-i-sobytiya\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, JavaScript"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/javascript-i-sobytiya\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/#listItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/otus.ru\/journal\/","nextItem":"https:\/\/otus.ru\/journal\/javascript-i-sobytiya\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/javascript-i-sobytiya\/#listItem","position":2,"name":"JavaScript \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f","previousItem":"https:\/\/otus.ru\/journal\/#listItem"}]},{"@type":"Organization","@id":"https:\/\/otus.ru\/journal\/#organization","name":"\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","url":"https:\/\/otus.ru\/journal\/","sameAs":["https:\/\/www.youtube.com\/channel\/UCetgtvy93o3i3CvyGXKFU3g"],"contactPoint":{"@type":"ContactPoint","telephone":"+74999389202","contactType":"Customer Support"}},{"@type":"Person","@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author","url":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/","name":"A. Pavlenko","image":{"@type":"ImageObject","@id":"https:\/\/otus.ru\/journal\/javascript-i-sobytiya\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d4c499a104d7c2522fa41f89e6819499?s=96&d=mm&r=g","width":96,"height":96,"caption":"A. Pavlenko"}},{"@type":"WebPage","@id":"https:\/\/otus.ru\/journal\/javascript-i-sobytiya\/#webpage","url":"https:\/\/otus.ru\/journal\/javascript-i-sobytiya\/","name":"JavaScript \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f OTUS","description":"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 JavaScript \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0443\u0447\u0438\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u043d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043b\u0435\u0433\u043a\u043e. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0443\u0433\u043b\u0443\u0431\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0434\u0438\u043d\u0433 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e \u0441 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u041f\u0440\u0438\u043c\u0435\u0440 \u2013 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u00ab\u043e\u0431\u044a\u0435\u043a\u0442\u044b\u00bb \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 \u0441\u043b\u0443\u0445\u0443 \u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0431\u044b\u0434\u0435\u043d\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u0436\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/javascript-i-sobytiya\/#breadcrumblist"},"author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"creator":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2022\/02\/oj-1080x720-5.png","@id":"https:\/\/otus.ru\/journal\/javascript-i-sobytiya\/#mainImage","width":1080,"height":720},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/javascript-i-sobytiya\/#mainImage"},"datePublished":"2022-02-03T18:56:54+00:00","dateModified":"2022-02-03T18:56:57+00:00"},{"@type":"WebSite","@id":"https:\/\/otus.ru\/journal\/#website","url":"https:\/\/otus.ru\/journal\/","name":"OTUS JOURNAL","description":"Blog about IT","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"}}]}
</script>
<!-- All in One SEO -->
<link rel='dns-prefetch' href='//otus.ru' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='stylesheet' id='wp-block-library-css' href='https://otus.ru/journal/wp-includes/css/dist/block-library/style.min.css?ver=6.4.7' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='wbcr-comments-plus-url-span-css' href='https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/css/url-span.css?ver=2.2.0' type='text/css' media='all' />
<link rel='stylesheet' id='wpel-style-css' href='https://otus.ru/journal/wp-content/plugins/wp-external-links/public/css/wpel.css?ver=2.59' type='text/css' media='all' />
<link rel='stylesheet' id='ez-toc-css' href='https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.61' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li {font-size: 95%;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='contentberg-fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700%7CPT+Serif%3A400%2C400i%2C600%7CIBM+Plex+Serif%3A500' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-core-css' href='https://otus.ru/journal/wp-content/themes/contentberg/style.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-lightbox-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/lightbox.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/fontawesome/css/font-awesome.min.css?ver=1.8.3' type='text/css' media='all' />
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/otus.ru\/journal","ignore_remote_prefetch":"1","ignore_list":["\/wp-admin\/"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/lazysizes.js" id="lazysizes-js"></script>
<link rel="https://api.w.org/" href="https://otus.ru/journal/wp-json/" /><link rel="alternate" type="application/json" href="https://otus.ru/journal/wp-json/wp/v2/posts/2822" /><link rel='shortlink' href='https://otus.ru/journal/?p=2822' />
<link rel="alternate" type="application/json+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fjavascript-i-sobytiya%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fjavascript-i-sobytiya%2F&format=xml" />
<script>var Sphere_Plugin = {"ajaxurl":"https:\/\/otus.ru\/journal\/wp-admin\/admin-ajax.php"};</script><link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-32x32.png" sizes="32x32" />
<link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-180x180.png" />
<meta name="msapplication-TileImage" content="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-270x270.png" />
<style type="text/css" id="wp-custom-css">
#menu-item-10406 .wpel-icon {
display: none;
}
#menu-item-10407 .wpel-icon {
display: none;
}
.otus-login-site a .wpel-icon {
display: none;
}
.menu-menju-navykov-container a .wpel-icon {
display: none;
}
.otus-login-site a
{
background: #ffd709;
border-radius: 12px;
color: #0f0f10;
font-size: 14px;
font-weight: 700;
line-height: 20px;
display: block;
text-align: center;
padding: 8px 25px;
}
.main-footer.dark {
background: linear-gradient(90deg, #a64fc5, #4f54e6);
border-color: transparent;
}
.main-footer.bold .copyright {
color: #fff;
}
.main-footer.bold .to-top i {
color: #fff;
}
.main-footer.bold .back-to-top {
color: #fff;
}
.nav__scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.scrollable-menu .menu {
display: flex;
}
.nav__scroll
{
background: linear-gradient(90deg, #a64fc5, #4f54e6);
}
.scrollable-menu .menu .menu-item {
flex: 0 0 auto;
padding: 15px 15px;
}
.scrollable-menu .menu .menu-item a {
color: #fff;
}
.nav__scroll::-webkit-scrollbar{background-color:#fff;height:5px;}
.nav__scroll::-webkit-scrollbar-thumb{background-color:#dcdcdc;}
.nav__scroll::-webkit-scrollbar-track{-webkit-border-radius:0;border-radius:0;background-color:#fff;}/
body {
min-width: 320px;
}
.banner-click img {
margin: 0 auto;
display: block;
}
.banner-click {
cursor: pointer;
}
.banner-footer-area {
margin-bottom: 20px;
}
.banner-left-area {
margin-top: 40px;
} </style>
<!--Start VDZ Yandex Metrika Plugin-->
<!-- Yandex.Metrika counter --><script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");ym(34531570, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer"});</script>
<noscript><div><img src="https://mc.yandex.ru/watch/34531570" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter --><!--START ADD EVENTS FROM CF7--><script type='text/javascript'>document.addEventListener( 'wpcf7submit', function( event ) {
//event.detail.contactFormId;
if(ym){
//console.log(event.detail);
ym(34531570, 'reachGoal', 'VDZ_SEND_CONTACT_FORM_7');
ym(34531570, 'params', {
page_url: window.location.href,
status: event.detail.status,
locale: event.detail.contactFormLocale,
form_id: event.detail.contactFormId,
});
}
}, false );
</script><!--END ADD EVENTS FROM CF7-->
<!--End VDZ Yandex Metrika Plugin-->
</head>
<body class="post-template-default single single-post postid-2822 single-format-standard right-sidebar lazy-normal has-lb">
<div class="main-wrap">
<header id="main-head" class="main-head head-nav-below has-search-modal simple simple-boxed">
<div class="inner inner-head" data-sticky-bar="0">
<div class="wrap cf wrap-head">
<div class="left-contain">
<span class="mobile-nav"><i class="fa fa-bars"></i></span>
<div class="title">
<a href="https://otus.ru/journal/" title="OTUS JOURNAL" rel="home" data-wpel-link="internal">
<span class="text-logo"><img src="/journal/wp-content/themes/contentberg/img/logo_site.svg" alt="OTUS JOURNAL"></span>
</a>
</div>
</div>
<div class="navigation-wrap inline">
<nav class="navigation inline simple light" data-sticky-bar="0">
<div class="menu-rubriki-container"><ul id="menu-rubriki" class="menu"><li id="menu-item-109" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-1 menu-item-109"><a href="https://otus.ru/journal/category/pro-it/" data-wpel-link="internal"><span>Про IT</span></a></li>
<li id="menu-item-113" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-cat-4 menu-item-113"><a href="https://otus.ru/journal/category/polza/" data-wpel-link="internal"><span>Полезное</span></a></li>
<li id="menu-item-114" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-3 menu-item-114"><a href="https://otus.ru/journal/category/lifestyle/" data-wpel-link="internal"><span>Лайфстайл</span></a></li>
<li id="menu-item-10406" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10406"><a href="https://otus.ru/catalog/courses" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Обучение</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10407" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10407"><a href="https://otus.ru/about" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Информация</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </nav>
</div>
<div class="actions">
<div class="otus-login-site">
<a href="https://otus.ru/login/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Войти<span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
<a href="#" title="Search" class="search-link"><i class="fa fa-search"></i></a>
</div>
</div>
</div>
</header> <!-- .main-head -->
<div class="nav nav_disable nav_colored nav_transparent course-categories__nav nav__scroll ">
<div class="container wrap">
<div class="links inline simple light scrollable-menu">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov" class="menu"><li id="menu-item-10413" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10414" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10415" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10416" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10417" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10419" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10420" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10421" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
</div>
</div>
<div class="main wrap">
<div class="ts-row cf">
<div class="col-8 main-content cf">
<article id="post-2822" class="the-post post-2822 post type-post status-publish format-standard has-post-thumbnail category-polza tag-javascript">
<header class="post-header the-post-header cf">
<div class="post-meta the-post-meta">
<span class="post-cat">
<a href="https://otus.ru/journal/category/polza/" class="category" data-wpel-link="internal">Полезное</a>
</span>
<h1 class="post-title">
JavaScript и события
</h1>
<a href="https://otus.ru/journal/javascript-i-sobytiya/" class="date-link" data-wpel-link="internal"><time class="post-date">3 февраля, 2022</time></a>
</div>
<div class="featured">
<a href="https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-5.png" class="image-link" data-wpel-link="internal"><img width="770" height="515" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20770%20515%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-contentberg-main size-contentberg-main lazyload wp-post-image" alt="JavaScript и события" title="JavaScript и события" decoding="async" fetchpriority="high" data-srcset="https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-5-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-5-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-5-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-5-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-5-270x180.png 270w" data-src="https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-5-770x515.png" data-sizes="(max-width: 770px) 100vw, 770px" /> </a>
</div>
</header><!-- .post-header -->
<div class="post-content description cf entry-content content-normal">
<div id="ez-toc-container" class="ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title " >Содержание</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#%D0%A2%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D1%8B" title="Термины">Термины</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-2" href="#%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5" title="Определение">Определение</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-3" href="#%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B_%D0%BE%D0%B1%D1%8A%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F" title="Принципы объявления">Принципы объявления</a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-4" href="#%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA" title="Встроенный обработчик">Встроенный обработчик</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-5" href="#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D0%B2_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C" title="Методы в помощь">Методы в помощь</a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class="ez-toc-link ez-toc-heading-6" href="#%D0%9F%D0%BE%D0%BF%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B" title="Популярные методы">Популярные методы</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-7" href="#%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_AddEventListener_%E2%80%93_%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%83%D0%B4%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%BE" title="Функция AddEventListener – предельное удобство">Функция AddEventListener – предельное удобство</a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class="ez-toc-link ez-toc-heading-8" href="#%D0%9A%D0%B0%D0%BA%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D1%8E%D1%82%D1%81%D1%8F" title="Какие методы используются">Какие методы используются</a></li></ul></li></ul></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-9" href="#%D0%9E_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0%D1%85_%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B9" title="О свойствах обработчика событий">О свойствах обработчика событий</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-10" href="#%D0%AD%D0%BA%D1%81%D0%BF%D0%B5%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D1%81%D0%BE_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0%D0%BC%D0%B8" title="Эксперименты со свойствами">Эксперименты со свойствами</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-11" href="#%D0%92%D1%8B%D0%B1%D0%BE%D1%80_%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC%D0%B0" title="Выбор оптимального механизма">Выбор оптимального механизма</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-12" href="#%D0%9D%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE_%D1%81%D0%BB%D0%BE%D0%B2_%D0%BE%D0%B1_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0%D1%85_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B9" title="Несколько слов об объектах событий">Несколько слов об объектах событий</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-13" href="#%D0%9F%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE_%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E_%E2%80%93_%D0%BF%D1%80%D0%B5%D0%B4%D0%BE%D1%82%D0%B2%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5" title="Поведение по умолчанию – предотвращение">Поведение по умолчанию – предотвращение</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-14" href="#%D0%92%D1%81%D0%BF%D0%BB%D1%8B%D1%82%D0%B8%D0%B5_%D0%B8_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%B2%D0%B0%D1%82" title="Всплытие и перехват">Всплытие и перехват</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-15" href="#%D0%9A%D0%BE%D0%BD%D1%86%D0%B5%D0%BF%D1%86%D0%B8%D1%8F_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F" title="Концепция функционирования">Концепция функционирования</a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-16" href="#%D0%98%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC" title="Исправление проблем">Исправление проблем</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-17" href="#%D0%9E_%D0%B4%D0%B5%D0%BB%D0%B5%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8" title="О делегировании">О делегировании</a></li></ul></li></ul></nav></div>
<p>Программирование на JavaScript позволяет разработчикам достаточно выучить синтаксис, но на практике им пользоваться не всегда легко. В процессе углубления в коддинг предстоит иметь дело с разнообразными элементами и возможностями. Пример – события.</p>
<p>Соответствующие «объекты» находятся на слуху и активно встречаются в обыденной жизни человека. Программирование тоже предлагает работу с событиями. В данном случае кодификация находится под управлением так называемых Events. Браузер будет генерировать происшествие, когда с документами или их элементами что-либо происходит.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A2%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D1%8B"></span>Термины<span class="ez-toc-section-end"></span></h2>
<p>Помимо стандартной терминологии программирования, чтобы работать с рассматриваемым компонентом, необходимо запомнить дополнительно следующую информацию:</p>
<ol type="1"><li>Тип событий – строка, которая отвечает за определение типа манипуляций, повлекшей за собой то или иное происшествие.</li><li>Цель – объект, в котором возникает событие. Может выступать элементом, связанным с происшествием.</li><li>Обработчики событий – функции, предназначенные для обработки или отклика на возникшее происшествие.</li><li>Объект – элемент, который связан с событием и содержит данные об оном.</li></ol>
<p>Перечисленные термины и понятия помогут лучше ориентироваться в выбранном направлении. Для реализации поставленной задачи достаточно базовых знаний работы с HTML и JS.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5"></span>Определение<span class="ez-toc-section-end"></span></h2>
<p>Событие – то, что происходит в процессе выполнения определенных действий. Своеобразная возможность взаимодействия. Пользователь так получает право работать с открытой в интернет-обозревателе странице.</p>
<p>Пример – нажатие на клавишу с целью внесения тех или иных корректировок. Клиент нажимает сочетание ctrl +, чтобы увеличить масштаб отображаемой страницы.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B_%D0%BE%D0%B1%D1%8A%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F"></span>Принципы объявления<span class="ez-toc-section-end"></span></h3>
<p>В данной статье будут рассмотрены основы работы с элементами событий. Оные могут быть объявлены несколькими способами:</p>
<ul><li>методами;</li><li>функцией addEventListener();</li><li>посредством HTML атрибутов.</li></ul>
<p>Каждый прием предусматривает собственные преимущества и недостатки. Пока разработчик не определился с возможным подходом, лучше изучить их все.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA"></span>Встроенный обработчик<span class="ez-toc-section-end"></span></h4>
<p>Самый простой вариант развития событий, который можно использовать на практике – это встроенный обработчик рассматриваемых «элементов». В основе него лежат HTML атрибуты:</p>
<figure class="wp-block-image size-large"><img decoding="async" width="863" height="236" src="https://otus.ru/journal/wp-content/uploads/2022/02/1-4.jpg" alt="JavaScript и события" class="wp-image-2825" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/1-4.jpg 863w, https://otus.ru/journal/wp-content/uploads/2022/02/1-4-300x82.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/1-4-150x41.jpg 150w, https://otus.ru/journal/wp-content/uploads/2022/02/1-4-768x210.jpg 768w" sizes="(max-width: 863px) 100vw, 863px" /></figure>
<p>Сегодня к помощи подобного приема практически не прибегают. Встречается метод в некоторых фреймворках.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D0%B2_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C"></span>Методы в помощь<span class="ez-toc-section-end"></span></h4>
<p>Существует много вариантов работы с элементами Events. Более интересный прием – это реализация при помощи так называемых методов. Он встречается на практике довольно часто. Работать таким образом должен уметь каждый программер.</p>
<figure class="wp-block-image size-large"><img decoding="async" width="456" height="138" src="https://otus.ru/journal/wp-content/uploads/2022/02/2-4.jpg" alt="JavaScript и события" class="wp-image-2826" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/2-4.jpg 456w, https://otus.ru/journal/wp-content/uploads/2022/02/2-4-300x91.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/2-4-150x45.jpg 150w" sizes="(max-width: 456px) 100vw, 456px" /></figure>
<p>Выше приведен пример реализации событий путем задействования специальных методов. Ключевой особенностью здесь является то, что рассматриваемый пример поддерживает вложенность.</p>
<h5 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D0%BF%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B"></span>Популярные методы<span class="ez-toc-section-end"></span></h5>
<p>Любой уважающий себя программер, работающий с Events, должен изучить имеющиеся методы оных:</p>
<ul><li>onclick — кликанье курсором мышки;</li><li>oncontextmenu – правая кнопка мыши, нажатие;</li><li>onmousemove – перемещение курсора на задействованном элементе страницы;</li><li>onmouseup – смещение курсора вниз;</li><li>onmousedown – нажатие на кнопку, имеющейся на мышке;</li><li>onkeydown – щелканье по клавише;</li><li>onkeyup – опускание клавиши;</li><li>onkeypress – зажатие имеющегося элемента управления.</li></ul>
<p>Это далеко не все методы. Они просто встречаются на практике чаще остальных. Без них код составить весьма проблематично.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_AddEventListener_%E2%80%93_%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%83%D0%B4%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%BE"></span>Функция AddEventListener – предельное удобство<span class="ez-toc-section-end"></span></h4>
<p>Это – наиболее простое решение, если хотим воспользоваться событиями в JS. Метод AddEventListener выглядит на примере так:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="512" height="132" src="https://otus.ru/journal/wp-content/uploads/2022/02/3-3.jpg" alt="JavaScript и события" class="wp-image-2827" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/3-3.jpg 512w, https://otus.ru/journal/wp-content/uploads/2022/02/3-3-300x77.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/3-3-150x39.jpg 150w" sizes="(max-width: 512px) 100vw, 512px" /></figure>
<p>Стоит рассмотреть функцию, которая будет добавлять обработчик событий. У нее имеются два параметра:</p>
<ul><li>название события;</li><li>непосредственно работающая функция, активирующаяся при срабатывании event.</li></ul>
<p>Удалить ранее добавленный обработчик можно через removeEventListener:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="464" height="62" src="https://otus.ru/journal/wp-content/uploads/2022/02/4-3.jpg" alt="JavaScript и события" class="wp-image-2828" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/4-3.jpg 464w, https://otus.ru/journal/wp-content/uploads/2022/02/4-3-300x40.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/4-3-150x20.jpg 150w" sizes="(max-width: 464px) 100vw, 464px" /></figure>
<h5 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%B0%D0%BA%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D1%8E%D1%82%D1%81%D1%8F"></span>Какие методы используются<span class="ez-toc-section-end"></span></h5>
<p>Можно использовать следующие «элементы» для создания events:</p>
<ul><li>click – щелчок мышкой;</li><li>mouseup – что происходит, когда кнопка мыши отпускается;</li><li>mousedown – нажатие на кнопку мыши;</li><li>mousemove – перемещение курсора на используемом элементе;</li><li>contextmenu – клик ПКМ;</li><li>kedown – щелканье по клавише;</li><li>keyup – отпускание имеющейся клавиши;</li><li>keypress – зажатие.</li></ul>
<p>Данные методы почти такие же, как и в предыдущем варианте, но без своеобразной характерной приставки on.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0%D1%85_%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B9"></span>О свойствах обработчика событий<span class="ez-toc-section-end"></span></h2>
<p>Программирование на JS предоставляет немало способов добавления кодов обработчиков событий на имеющиеся веб-странички. У упомянутых элементов имеются различные свойства. Рассмотрим их на примере кода:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="785" height="175" src="https://otus.ru/journal/wp-content/uploads/2022/02/5-2.jpg" alt="JavaScript и события" class="wp-image-2829" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/5-2.jpg 785w, https://otus.ru/journal/wp-content/uploads/2022/02/5-2-300x67.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/5-2-150x33.jpg 150w, https://otus.ru/journal/wp-content/uploads/2022/02/5-2-768x171.jpg 768w" sizes="(max-width: 785px) 100vw, 785px" /></figure>
<p>Здесь onclick выступает в качестве свойства обработчика событий. Относится к так называемому особому типу. При установки оного равным тому или иному коду, соответствующий элемент будет запущен, если event произойдет.</p>
<p>Чтобы добиться аналогичного результата, можно присвоить свойству обработчика имя функции, описанной ранее:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="778" height="210" src="https://otus.ru/journal/wp-content/uploads/2022/02/6-1.jpg" alt="JavaScript и события" class="wp-image-2830" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/6-1.jpg 778w, https://otus.ru/journal/wp-content/uploads/2022/02/6-1-300x81.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/6-1-150x40.jpg 150w, https://otus.ru/journal/wp-content/uploads/2022/02/6-1-768x207.jpg 768w" sizes="(max-width: 778px) 100vw, 778px" /></figure>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%AD%D0%BA%D1%81%D0%BF%D0%B5%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D1%81%D0%BE_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0%D0%BC%D0%B8"></span>Эксперименты со свойствами<span class="ez-toc-section-end"></span></h3>
<p>На основе предложенного выше примера можно «поиграть», меняя свойство events. <a href="https://github.com/mdn/learning-area/blob/main/javascript/building-blocks/events/random-color-eventhandlerproperty.html" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Данная ссылка<span class="wpel-icon wpel-image wpel-icon-6"></span></a> подскажет, как создать копию файла для дальнейшего применения. Document отвечает за случайные цвета.</p>
<p>Измените btn.onclick на предложенные далее значения, а далее смотрите, что произошло в том или ином случае:</p>
<ol type="1"><li>Onfocus и onlblur. Цвет будет корректироваться, когда кнопка сфокусируется или не сфокусирована соответственно. Свойство применяется при отображении информации для заполнения полей форм. Если фокусировка отсутствует – для отображения сообщения об ошибке. Аналогичные действия происходят, когда данные введены неверно.</li><li>Onblclick – изменения осуществляются при условии двойного щелчка.</li><li>Window.onkeypress/onkeydown/onkeyup – событие срабатывает, если произойдет нажатие той или иной клавиши на клавиатуре. Keypress сошлется на обычный клик, keydown и keyup разделят операцию на нажатие и отпускание элемента управления. Если обработчик событий регистрируется на самой кнопке, применяется объект window. Это – все окно используемого клиентом браузера.</li><li>Onmouseover и onmouseout – корректировка цвета, если курсор наведен на кнопку или отведен от нее соответственно.</li></ol>
<p>Некоторые события выступают в качестве универсальных. Их можно применять практически в любом элементе кода. Пример – onclick, который регистрируется для любого имеющегося объекта. Лишь некоторые ивенты обладают конкретизацией, а также задействуются в узконаправленных ситуациях. Пример – onplay для элементов <video>.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%92%D1%8B%D0%B1%D0%BE%D1%80_%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC%D0%B0"></span>Выбор оптимального механизма<span class="ez-toc-section-end"></span></h3>
<p>Для того, чтобы получить контент максимально функциональный и быстрый, требуется грамотно использовать функциональные возможности языка. В случае с JS и ивентами получить предельную работоспособность удается, если выбрать грамотный механизм реализации.</p>
<p>Из предложенных ранее метод рекомендуется избегать встроенных атрибутов событий HTML. Данная практика является устаревшей. Оставшиеся два подхода считаются взаимозаменяемыми, особенно если речь идет о простейших манипуляциях:</p>
<ol type="1"><li>Свойства одного обработчика событий обладают меньшей мощностью и параметрами, но лучше обеспечивают совместимость с браузерами. Данный момент рекомендуется учитывать на первых порах обучения.</li><li>События уровня 2 DOM обладают большей мощностью. Могут доставить определенные хлопоты из-за усложненной структуры. Обладают худшей поддержкой.</li></ol>
<p>Через функции EventListener() можно при желании удалить код обработчика или создать новый элемент.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9D%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE_%D1%81%D0%BB%D0%BE%D0%B2_%D0%BE%D0%B1_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0%D1%85_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B9"></span>Несколько слов об объектах событий<span class="ez-toc-section-end"></span></h2>
<p>Внутри функций обработчика иногда встречается параметр, который задается именем event или e. Это объект события. Передается обработчикам событий автоматически. Это необходимо для обеспечения дополнительных функций и данных. Вот наглядный пример:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="756" height="197" src="https://otus.ru/journal/wp-content/uploads/2022/02/7-2.jpg" alt="JavaScript и события" class="wp-image-2831" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/7-2.jpg 756w, https://otus.ru/journal/wp-content/uploads/2022/02/7-2-300x78.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/7-2-150x39.jpg 150w" sizes="(max-width: 756px) 100vw, 756px" /></figure>
<p>Здесь происходит следующее:</p>
<ol type="1"><li>Объект события e включается в функцию.</li><li>В функции осуществляется настройка стилистики фона для e.target. Это кнопка.</li><li>Свойство объекта события target – это всегда ссылка на элемент, где осуществилось то или иное происшествие.</li></ol>
<p>Предложенный пример событие всплывает относительно случайного цвета фона на кнопке, а не на всей странице сразу.</p>
<p>e.target применяется тогда, когда возникает необходимость в установке одного и того же обработчика событий на несколько элементов. Также важно, чтобы на них происходило происшествие сразу ко всем «объектам». Пример – есть набор из 20 плиток, которые, если нажали на кнопку, исчезнут «одним махом».</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE_%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E_%E2%80%93_%D0%BF%D1%80%D0%B5%D0%B4%D0%BE%D1%82%D0%B2%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5"></span>Поведение по умолчанию – предотвращение<span class="ez-toc-section-end"></span></h3>
<p>Бывает так, что нужно оставить событие, которое выполняет действия, предусматриваемые коддингом «по умолчанию». Пример – веб-форма регистрационного характера. При вводе данных и нажатии кнопки отправки собранные материалы отправляются на установленную страничку сервера, чтобы обработать оные. Браузер окажется перенаправленным на страницу с сообщением об успешной регистрации.</p>
<p>Но при регистрации можно допустить ошибку. В этом случае требуется:</p>
<ul><li>остановить отправку информации на сервер;</li><li>показать пользователю сообщение об ошибке;</li><li>указать на допущенные неточности для корректировки.</li></ul>
<p>Некоторые браузеры поддерживают автоматическую проверку данных форм, но полагаться на их работоспособность не стоит. Вот форма, в которой вводят фамилию и имя:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="429" height="347" src="https://otus.ru/journal/wp-content/uploads/2022/02/8-2.jpg" alt="JavaScript и события" class="wp-image-2832" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/8-2.jpg 429w, https://otus.ru/journal/wp-content/uploads/2022/02/8-2-300x243.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/8-2-150x121.jpg 150w" sizes="(max-width: 429px) 100vw, 429px" /></figure>
<p>А так выглядит реализация простейшей проверки внутри обработчика события onsubmit. Отвечает за проверку на пустоту текстовых полей. Если это так, происходит вызов функции preventDefault() объекта события. Она отвечает за остановку отправки формы. Далее на экране появится сообщение об ошибке.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="570" height="297" src="https://otus.ru/journal/wp-content/uploads/2022/02/9-2.jpg" alt="JavaScript и события" class="wp-image-2833" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/9-2.jpg 570w, https://otus.ru/journal/wp-content/uploads/2022/02/9-2-300x156.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/9-2-150x78.jpg 150w" sizes="(max-width: 570px) 100vw, 570px" /></figure>
<p>Предложенная проверка форма является слабой, но это не мешает разобраться в принципах работы.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%92%D1%81%D0%BF%D0%BB%D1%8B%D1%82%D0%B8%D0%B5_%D0%B8_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%B2%D0%B0%D1%82"></span>Всплытие и перехват<span class="ez-toc-section-end"></span></h3>
<p>Данные события встречаются не слишком часто, но они могут стать настоящей головной болью. Речь идет о механизмах всплытия и перехвата. Отвечают за описание, когда два обработчика одного и того же события активируются в пределах одного элемента.</p>
<p>Чтобы лучше разобраться в теме, стоит взглянуть на наглядный <a href="https://mdn.github.io/learning-area/javascript/building-blocks/events/show-video-box.html" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">пример<span class="wpel-icon wpel-image wpel-icon-6"></span></a> с <a href="https://github.com/mdn/learning-area/blob/main/javascript/building-blocks/events/show-video-box.html" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">исходным кодом<span class="wpel-icon wpel-image wpel-icon-6"></span></a>. Оба – в отдельных браузерных вкладках. Он помогает разобраться с показом и сокрытием <div> с элементом <video> внутри оного:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="930" height="242" src="https://otus.ru/journal/wp-content/uploads/2022/02/10-2.jpg" alt="JavaScript и события" class="wp-image-2834" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/10-2.jpg 930w, https://otus.ru/journal/wp-content/uploads/2022/02/10-2-300x78.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/10-2-150x39.jpg 150w, https://otus.ru/journal/wp-content/uploads/2022/02/10-2-768x200.jpg 768w" sizes="(max-width: 930px) 100vw, 930px" /></figure>
<p>Здесь происходит следующее:</p>
<ul type="1"><li>Осуществляется нажатие на кнопку.</li><li>Атрибут класса элемента <div> корректируется на showing.</li></ul>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="631" height="474" src="https://otus.ru/journal/wp-content/uploads/2022/02/11-2.jpg" alt="JavaScript и события" class="wp-image-2835" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/11-2.jpg 631w, https://otus.ru/journal/wp-content/uploads/2022/02/11-2-300x225.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/11-2-150x113.jpg 150w" sizes="(max-width: 631px) 100vw, 631px" /></figure>
<ul type="1"><li>Добавляются обработчики событий onclick. Один – к div, другой – к video. Посредством использования указателя мыши при щелчке по области div вне зоны видео поле скрывается. Если действие осуществляется в пределах «ограниченной области» — видео воспроизводится.</li></ul>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="568" height="250" src="https://otus.ru/journal/wp-content/uploads/2022/02/12-1.jpg" alt="JavaScript и события" class="wp-image-2836" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/12-1.jpg 568w, https://otus.ru/journal/wp-content/uploads/2022/02/12-1-300x132.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/12-1-150x66.jpg 150w" sizes="(max-width: 568px) 100vw, 568px" /></figure>
<p>Тут возникает проблема – если нажать на видео, оно будет производиться, одновременно скрывая div. Такое поведение связано с тем, что ролик находится внутри div и выступает его частью. Осуществляется запуск нескольких обработчиков событий.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BE%D0%BD%D1%86%D0%B5%D0%BF%D1%86%D0%B8%D1%8F_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F"></span>Концепция функционирования<span class="ez-toc-section-end"></span></h3>
<p>При инициировании события элементом с родительскими компонентами браузеры работают в два этапа. А именно – захват и всплытие.</p>
<p>При захвате осуществляется следующее:</p>
<ol type="1"><li>Обозреватель проводит проверку, обладает ли внешний элемент <html> обработчик события onclick, который регистрируется при захвате. Если это так, происходит запуск оного.</li><li>Осуществляется переход к следующему элементу внутри <html>.</li><li>Выполняются действия, описанные на первом шаге. Это происходит до тех пор, пока приложение не дойдет до объекта, на который на самом деле щелкнули.</li></ol>
<p>При всплытии имеет место противоположность:</p>
<ol type="1"><li>Браузер проверяет, есть ли onclick на нажатом элементе.</li><li>Происходит запуск оного, если обнаружено соответствие.</li><li>Переход к следующему родительскому элементу с последующей проверкой. Происходит это до тех пор, пока не будет достигнут элемент <html>.</li></ol>
<p>Нынешние браузеры изначально регистрируют обработчики на фазе всплытия.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC"></span>Исправление проблем<span class="ez-toc-section-end"></span></h4>
<p>Для корректировки проблем, связанных с регистрацией, а также всплытием и захватом можно использовать стандартный объект stopSPropagation. При вызове в обработчике событий объекта делает так, чтобы обработчик выполнялся, но event не всплывало далее по цепочки. Это значит, что другие обработчики не запустятся.</p>
<p>В рассмотренном примере возникшую проблему можно решить, изменив вторую строку на:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="340" height="123" src="https://otus.ru/journal/wp-content/uploads/2022/02/13-1.jpg" alt="JavaScript и события" class="wp-image-2837" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/13-1.jpg 340w, https://otus.ru/journal/wp-content/uploads/2022/02/13-1-300x109.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/13-1-150x54.jpg 150w" sizes="(max-width: 340px) 100vw, 340px" /></figure>
<p>Но есть и еще один довольно важный механизм. Он называется «делегирование».</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E_%D0%B4%D0%B5%D0%BB%D0%B5%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8"></span>О делегировании<span class="ez-toc-section-end"></span></h3>
<p>Делегирование событий в языке JS позволяет правильно работать с родительскими элементами. Дочерние отдельно друг от друга не обрабатываются при подобных обстоятельствах. Каждый новый элемент, добавленный в родительский блок, будет автоматически наследовать характерные события.</p>
<p>Вот пример, где теги li – это дочерние теги ul. Работа осуществляется со всеми li:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="159" height="112" src="https://otus.ru/journal/wp-content/uploads/2022/02/14-1.jpg" alt="JavaScript и события" class="wp-image-2838" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/14-1.jpg 159w, https://otus.ru/journal/wp-content/uploads/2022/02/14-1-150x106.jpg 150w" sizes="(max-width: 159px) 100vw, 159px" /></figure>
<p>Сначала требуется:</p>
<ul><li>обеспечить данные для работы;</li><li>родитель получается из метода querySelector;</li><li>дети – через querySelectorAll;</li><li>первый метод получит один элемент, для группы одинаковых «объектов» применяется второй вариант.</li></ul>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="367" height="45" src="https://otus.ru/journal/wp-content/uploads/2022/02/15-1.jpg" alt="JavaScript и события" class="wp-image-2840" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/15-1.jpg 367w, https://otus.ru/journal/wp-content/uploads/2022/02/15-1-300x37.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/15-1-150x18.jpg 150w" sizes="(max-width: 367px) 100vw, 367px" /></figure>
<p>Далее подключается обработчик addEventListener на родителя. Первый параметр – передача события клика. Второй параметр – callback функция с передаваемым объектом события, чтобы свойства объекта вызывались внутри. Завершающий этап – вывод на консоль.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="363" height="51" src="https://otus.ru/journal/wp-content/uploads/2022/02/16-1.jpg" alt="JavaScript и события" class="wp-image-2841" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/16-1.jpg 363w, https://otus.ru/journal/wp-content/uploads/2022/02/16-1-300x42.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/16-1-150x21.jpg 150w" sizes="(max-width: 363px) 100vw, 363px" /></figure>
<p>Свойства выводятся в консоль при клике по имеющемуся списку. Цепочка выглядит так:</p>
<ul><li>событие мышки;</li><li>цель;</li><li>имя тега.</li></ul>
<p>Требуется узнать, куда щелкнул пользователь. Если по списку – происходит выполнение действия.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="447" height="50" src="https://otus.ru/journal/wp-content/uploads/2022/02/17-1.jpg" alt="JavaScript и события" class="wp-image-2842" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/17-1.jpg 447w, https://otus.ru/journal/wp-content/uploads/2022/02/17-1-300x34.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/17-1-150x17.jpg 150w" sizes="(max-width: 447px) 100vw, 447px" /></figure>
<p>Если цель события клика event случит тег LI, в консоли возникает надпись «Привет!». В первой части условия ивент.таргет проводится проверка, есть ли у объекта события свойство target. Во второй части после оператора AND проводится удостоверение в том, что был проведен клик по тегу li.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="417" height="125" src="https://otus.ru/journal/wp-content/uploads/2022/02/18-1.jpg" alt="JavaScript и события" class="wp-image-2843" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/18-1.jpg 417w, https://otus.ru/journal/wp-content/uploads/2022/02/18-1-300x90.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/18-1-150x45.jpg 150w" sizes="(max-width: 417px) 100vw, 417px" /></figure>
<p>Делегирование требуется тогда, когда на страничке много элементов, работающих с одним и тем же обработчиком событий. А чтобы такие понятия как события, input type и так далее не доставляли хлопот, стоит пройти специализированные дистанционные курсы. Есть предложения для новичков и опытных программеров. Рассчитаны курсы на срок до 12 месяцев. Можно изучить JS с нуля!</p>
<figure class="wp-block-image size-large"><a href="https://otus.ru/lessons/specializacija-fullstack-dev/?utm_source=oj&utm_medium=affilate&utm_campaign=spec_js" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><img loading="lazy" decoding="async" width="970" height="70" src="https://otus.ru/journal/wp-content/uploads/2022/02/JS-FullstackSpec_Headline_970x70-16-3.png" alt="JavaScript и события" class="wp-image-2823" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/JS-FullstackSpec_Headline_970x70-16-3.png 970w, https://otus.ru/journal/wp-content/uploads/2022/02/JS-FullstackSpec_Headline_970x70-16-3-300x22.png 300w, https://otus.ru/journal/wp-content/uploads/2022/02/JS-FullstackSpec_Headline_970x70-16-3-150x11.png 150w, https://otus.ru/journal/wp-content/uploads/2022/02/JS-FullstackSpec_Headline_970x70-16-3-768x55.png 768w" sizes="(max-width: 970px) 100vw, 970px" /></a></figure>
</div><!-- .post-content -->
<div class="the-post-foot cf">
<div class="tag-share cf">
<div class="post-tags"><a href="https://otus.ru/journal/tag/javascript/" rel="tag" data-wpel-link="internal">JavaScript</a></div>
<div class="post-share">
<div class="post-share-icons cf">
<span class="counters">
</span>
<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fotus.ru%2Fjournal%2Fjavascript-i-sobytiya%2F" class="link facebook wpel-icon-right" target="_blank" title="Share on Facebook" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-facebook"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fjavascript-i-sobytiya%2F&text=JavaScript%20%D0%B8%20%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F" class="link twitter wpel-icon-right" target="_blank" title="Share on Twitter" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-twitter"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fotus.ru%2Fjournal%2Fjavascript-i-sobytiya%2F" class="link linkedin wpel-icon-right" target="_blank" title="LinkedIn" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-linkedin"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fjavascript-i-sobytiya%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2022%2F02%2Foj-1080x720-5.png&description=JavaScript%20%D0%B8%20%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F" class="link pinterest wpel-icon-right" target="_blank" title="Pinterest" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-pinterest-p"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
</div>
</div>
</div>
<div class="post-nav">
<div class="post previous cf">
<a href="https://otus.ru/journal/modulnoe-programmirovanie-v-javascript-ot-a-do-ya/" title="Prev Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-left"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/modulnoe-programmirovanie-v-javascript-ot-a-do-ya/" class="image-link" rel="previous" data-wpel-link="internal">
<img width="150" height="100" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20100%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Модульное программирование в JavaScript от А до Я" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-768x512.png 768w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-370x245.png 370w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4.png 1080w" data-src="https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-150x100.png" data-sizes="(max-width: 150px) 100vw, 150px" title="Модульное программирование в JavaScript от А до Я" /> </a>
<div class="post-meta">
<span class="label">Prev Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/modulnoe-programmirovanie-v-javascript-ot-a-do-ya/" data-wpel-link="internal">Модульное программирование в JavaScript от А до Я</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/modulnoe-programmirovanie-v-javascript-ot-a-do-ya/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2022-02-03T18:43:14+00:00">3 февраля, 2022</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">8 Mins Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/tehnologii-jsp-opisanie-osobennosti-ispolzovanie/" title="Next Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-right"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/tehnologii-jsp-opisanie-osobennosti-ispolzovanie/" class="image-link" rel="next" data-wpel-link="internal">
<img width="150" height="100" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20100%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Технологии JSP: описание, особенности, использование" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-6-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-6-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-6-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-6-768x512.png 768w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-6-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-6-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-6-370x245.png 370w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-6.png 1080w" data-src="https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-6-150x100.png" data-sizes="(max-width: 150px) 100vw, 150px" title="Технологии JSP: описание, особенности, использование" /> </a>
<div class="post-meta">
<span class="label">Next Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/tehnologii-jsp-opisanie-osobennosti-ispolzovanie/" data-wpel-link="internal">Технологии JSP: описание, особенности, использование</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/tehnologii-jsp-opisanie-osobennosti-ispolzovanie/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2022-02-03T19:25:52+00:00">3 февраля, 2022</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">9 Mins Read</span>
</div>
</div> </div>
</span>
</div>
</div>
<section class="related-posts grid-3">
<h4 class="section-head"><span class="title">Читать ещё</span></h4>
<div class="ts-row posts cf">
<article class="post col-4">
<a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" title="Уровень готовности CTO к 2026" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Уровень готовности CTO к 2026" title="Уровень готовности CTO к 2026" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" class="post-link" data-wpel-link="internal">Уровень готовности CTO к 2026</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-16T19:50:59+00:00">16 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" title="Новые уроки ноября: только топ-темы по программированию" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Новые уроки ноября: только топ-темы по программированию" title="Новые уроки ноября: только топ-темы по программированию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" class="post-link" data-wpel-link="internal">Новые уроки ноября: только топ-темы по программированию</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-09T23:24:11+00:00">9 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/schjot-idjot-na-chasy/" title="Счёт идёт на часы" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Счёт идёт на часы" title="Счёт идёт на часы" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-370x245.png 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/schjot-idjot-na-chasy/" class="post-link" data-wpel-link="internal">Счёт идёт на часы</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-10-30T15:04:59+00:00">30 октября, 2025</time>
</div>
</div>
</article >
</div>
</section>
</article> <!-- .the-post -->
</div>
<aside class="col-4 sidebar">
<div class="inner">
<ul>
<li id="search-2" class="widget widget_search"><h5 class="widget-title"><span>Поиск по блогу</span></h5>
<form method="get" class="search-form" action="https://otus.ru/journal/">
<label>
<span class="screen-reader-text">Search for:</span>
<input type="search" class="search-field" placeholder="Введите запрос и нажмите Enter" value="" name="s" title="Search for:" />
</label>
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</form>
</li>
<li id="tag_cloud-5" class="widget widget_tag_cloud"><h5 class="widget-title"><span>Метки</span></h5><div class="tagcloud"><a href="https://otus.ru/journal/tag/android-2/" class="tag-cloud-link tag-link-74 tag-link-position-1" style="font-size: 12.472222222222pt;" aria-label="Android (34 элемента)" data-wpel-link="internal">Android</a>
<a href="https://otus.ru/journal/tag/c-3/" class="tag-cloud-link tag-link-91 tag-link-position-2" style="font-size: 10.916666666667pt;" aria-label="C (23 элемента)" data-wpel-link="internal">C</a>
<a href="https://otus.ru/journal/tag/c-2/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 12.666666666667pt;" aria-label="C# (35 элементов)" data-wpel-link="internal">C#</a>
<a href="https://otus.ru/journal/tag/c/" class="tag-cloud-link tag-link-20 tag-link-position-4" style="font-size: 12.472222222222pt;" aria-label="c++ (34 элемента)" data-wpel-link="internal">c++</a>
<a href="https://otus.ru/journal/tag/computer-science/" class="tag-cloud-link tag-link-209 tag-link-position-5" style="font-size: 15.972222222222pt;" aria-label="computer science (78 элементов)" data-wpel-link="internal">computer science</a>
<a href="https://otus.ru/journal/tag/css/" class="tag-cloud-link tag-link-288 tag-link-position-6" style="font-size: 8.6805555555556pt;" aria-label="CSS (13 элементов)" data-wpel-link="internal">CSS</a>
<a href="https://otus.ru/journal/tag/data-science/" class="tag-cloud-link tag-link-151 tag-link-position-7" style="font-size: 8pt;" aria-label="Data Science (11 элементов)" data-wpel-link="internal">Data Science</a>
<a href="https://otus.ru/journal/tag/devops/" class="tag-cloud-link tag-link-98 tag-link-position-8" style="font-size: 10.138888888889pt;" aria-label="devops (19 элементов)" data-wpel-link="internal">devops</a>
<a href="https://otus.ru/journal/tag/docker/" class="tag-cloud-link tag-link-143 tag-link-position-9" style="font-size: 8.2916666666667pt;" aria-label="Docker (12 элементов)" data-wpel-link="internal">Docker</a>
<a href="https://otus.ru/journal/tag/gamedev/" class="tag-cloud-link tag-link-25 tag-link-position-10" style="font-size: 11.694444444444pt;" aria-label="gamedev (28 элементов)" data-wpel-link="internal">gamedev</a>
<a href="https://otus.ru/journal/tag/hr/" class="tag-cloud-link tag-link-103 tag-link-position-11" style="font-size: 8pt;" aria-label="hr (11 элементов)" data-wpel-link="internal">hr</a>
<a href="https://otus.ru/journal/tag/html/" class="tag-cloud-link tag-link-217 tag-link-position-12" style="font-size: 11.208333333333pt;" aria-label="HTML (25 элементов)" data-wpel-link="internal">HTML</a>
<a href="https://otus.ru/journal/tag/ios/" class="tag-cloud-link tag-link-101 tag-link-position-13" style="font-size: 8.9722222222222pt;" aria-label="iOS (14 элементов)" data-wpel-link="internal">iOS</a>
<a href="https://otus.ru/journal/tag/it/" class="tag-cloud-link tag-link-50 tag-link-position-14" style="font-size: 10.527777777778pt;" aria-label="IT (21 элемент)" data-wpel-link="internal">IT</a>
<a href="https://otus.ru/journal/tag/java/" class="tag-cloud-link tag-link-75 tag-link-position-15" style="font-size: 15.680555555556pt;" aria-label="Java (73 элемента)" data-wpel-link="internal">Java</a>
<a href="https://otus.ru/journal/tag/javascript/" class="tag-cloud-link tag-link-83 tag-link-position-16" style="font-size: 14.319444444444pt;" aria-label="JavaScript (53 элемента)" data-wpel-link="internal">JavaScript</a>
<a href="https://otus.ru/journal/tag/linux/" class="tag-cloud-link tag-link-141 tag-link-position-17" style="font-size: 11.888888888889pt;" aria-label="Linux (29 элементов)" data-wpel-link="internal">Linux</a>
<a href="https://otus.ru/journal/tag/machine-learning/" class="tag-cloud-link tag-link-167 tag-link-position-18" style="font-size: 8.6805555555556pt;" aria-label="Machine Learning (13 элементов)" data-wpel-link="internal">Machine Learning</a>
<a href="https://otus.ru/journal/tag/otus-book/" class="tag-cloud-link tag-link-261 tag-link-position-19" style="font-size: 9.9444444444444pt;" aria-label="otus book (18 элементов)" data-wpel-link="internal">otus book</a>
<a href="https://otus.ru/journal/tag/php/" class="tag-cloud-link tag-link-45 tag-link-position-20" style="font-size: 10.527777777778pt;" aria-label="PHP (21 элемент)" data-wpel-link="internal">PHP</a>
<a href="https://otus.ru/journal/tag/python/" class="tag-cloud-link tag-link-27 tag-link-position-21" style="font-size: 16.944444444444pt;" aria-label="Python (99 элементов)" data-wpel-link="internal">Python</a>
<a href="https://otus.ru/journal/tag/qa/" class="tag-cloud-link tag-link-155 tag-link-position-22" style="font-size: 11.402777777778pt;" aria-label="qa (26 элементов)" data-wpel-link="internal">qa</a>
<a href="https://otus.ru/journal/tag/sql/" class="tag-cloud-link tag-link-38 tag-link-position-23" style="font-size: 12.861111111111pt;" aria-label="SQL (37 элементов)" data-wpel-link="internal">SQL</a>
<a href="https://otus.ru/journal/tag/team-lead/" class="tag-cloud-link tag-link-364 tag-link-position-24" style="font-size: 9.9444444444444pt;" aria-label="team lead (18 элементов)" data-wpel-link="internal">team lead</a>
<a href="https://otus.ru/journal/tag/unity/" class="tag-cloud-link tag-link-24 tag-link-position-25" style="font-size: 8pt;" aria-label="unity (11 элементов)" data-wpel-link="internal">unity</a>
<a href="https://otus.ru/journal/tag/algoritmy/" class="tag-cloud-link tag-link-30 tag-link-position-26" style="font-size: 9.9444444444444pt;" aria-label="Алгоритмы (18 элементов)" data-wpel-link="internal">Алгоритмы</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh/" class="tag-cloud-link tag-link-40 tag-link-position-27" style="font-size: 10.138888888889pt;" aria-label="Базы данных (19 элементов)" data-wpel-link="internal">Базы данных</a>
<a href="https://otus.ru/journal/tag/matematika/" class="tag-cloud-link tag-link-44 tag-link-position-28" style="font-size: 10.916666666667pt;" aria-label="Математика (23 элемента)" data-wpel-link="internal">Математика</a>
<a href="https://otus.ru/journal/tag/arhitektura-po/" class="tag-cloud-link tag-link-10 tag-link-position-29" style="font-size: 9.4583333333333pt;" aria-label="архитектура ПО (16 элементов)" data-wpel-link="internal">архитектура ПО</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh-2/" class="tag-cloud-link tag-link-251 tag-link-position-30" style="font-size: 10.138888888889pt;" aria-label="базы данных (19 элементов)" data-wpel-link="internal">базы данных</a>
<a href="https://otus.ru/journal/tag/vebinar/" class="tag-cloud-link tag-link-201 tag-link-position-31" style="font-size: 13.930555555556pt;" aria-label="вебинар (48 элементов)" data-wpel-link="internal">вебинар</a>
<a href="https://otus.ru/journal/tag/dajdzhest/" class="tag-cloud-link tag-link-308 tag-link-position-32" style="font-size: 10.722222222222pt;" aria-label="дайджест (22 элемента)" data-wpel-link="internal">дайджест</a>
<a href="https://otus.ru/journal/tag/zapis-vebinara/" class="tag-cloud-link tag-link-226 tag-link-position-33" style="font-size: 14.902777777778pt;" aria-label="запись вебинара (61 элемент)" data-wpel-link="internal">запись вебинара</a>
<a href="https://otus.ru/journal/tag/zapis-uroka/" class="tag-cloud-link tag-link-272 tag-link-position-34" style="font-size: 16.069444444444pt;" aria-label="запись урока (80 элементов)" data-wpel-link="internal">запись урока</a>
<a href="https://otus.ru/journal/tag/informacionnaya-bezopasnost/" class="tag-cloud-link tag-link-232 tag-link-position-35" style="font-size: 10.138888888889pt;" aria-label="информационная безопасность (19 элементов)" data-wpel-link="internal">информационная безопасность</a>
<a href="https://otus.ru/journal/tag/karera-v-it/" class="tag-cloud-link tag-link-292 tag-link-position-36" style="font-size: 9.9444444444444pt;" aria-label="карьера в IT (18 элементов)" data-wpel-link="internal">карьера в IT</a>
<a href="https://otus.ru/journal/tag/podborka/" class="tag-cloud-link tag-link-7 tag-link-position-37" style="font-size: 12.666666666667pt;" aria-label="подборка (35 элементов)" data-wpel-link="internal">подборка</a>
<a href="https://otus.ru/journal/tag/podborka-statej/" class="tag-cloud-link tag-link-219 tag-link-position-38" style="font-size: 15.777777777778pt;" aria-label="подборка статей (75 элементов)" data-wpel-link="internal">подборка статей</a>
<a href="https://otus.ru/journal/tag/programmirovanie/" class="tag-cloud-link tag-link-65 tag-link-position-39" style="font-size: 22pt;" aria-label="программирование (332 элемента)" data-wpel-link="internal">программирование</a>
<a href="https://otus.ru/journal/tag/proekt/" class="tag-cloud-link tag-link-321 tag-link-position-40" style="font-size: 11.888888888889pt;" aria-label="проект (29 элементов)" data-wpel-link="internal">проект</a>
<a href="https://otus.ru/journal/tag/proektnaya-rabota/" class="tag-cloud-link tag-link-310 tag-link-position-41" style="font-size: 11.597222222222pt;" aria-label="проектная работа (27 элементов)" data-wpel-link="internal">проектная работа</a>
<a href="https://otus.ru/journal/tag/seti/" class="tag-cloud-link tag-link-181 tag-link-position-42" style="font-size: 12.958333333333pt;" aria-label="сети (38 элементов)" data-wpel-link="internal">сети</a>
<a href="https://otus.ru/journal/tag/testirovanie/" class="tag-cloud-link tag-link-69 tag-link-position-43" style="font-size: 13.930555555556pt;" aria-label="тестирование (48 элементов)" data-wpel-link="internal">тестирование</a>
<a href="https://otus.ru/journal/tag/upravlenie-komandoj/" class="tag-cloud-link tag-link-63 tag-link-position-44" style="font-size: 11.694444444444pt;" aria-label="управление командой (28 элементов)" data-wpel-link="internal">управление командой</a>
<a href="https://otus.ru/journal/tag/habr-2/" class="tag-cloud-link tag-link-203 tag-link-position-45" style="font-size: 13.930555555556pt;" aria-label="хабр (48 элементов)" data-wpel-link="internal">хабр</a></div>
</li>
</ul>
</div>
</aside>
</div> <!-- .ts-row -->
</div> <!-- .main -->
<footer class="main-footer dark bold">
<section class="lower-footer cf">
<div class="wrap">
<div class="links">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
<p class="copyright"> © 2015-2026 OTUS </p>
<div class="to-top">
<a href="#" class="back-to-top"><i class="fa fa-angle-up"></i> Top</a>
</div>
</div>
</section>
</footer>
</div> <!-- .main-wrap -->
<div class="mobile-menu-container off-canvas" id="mobile-menu">
<a href="#" class="close"><i class="fa fa-times"></i></a>
<div class="logo">
</div>
<ul class="mobile-menu"></ul>
</div>
<div class="search-modal-wrap">
<div class="search-modal-box" role="dialog" aria-modal="true">
<form method="get" class="search-form" action="https://otus.ru/journal/">
<input type="search" class="search-field" name="s" placeholder="Search..." value="" required />
<button type="submit" class="search-submit visuallyhidden">Submit</button>
<p class="message">
Type above and press <em>Enter</em> to search. Press <em>Esc</em> to cancel. </p>
</form>
</div>
</div>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/js/url-span.js" id="wbcr-comments-plus-url-span-js"></script>
<script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js" id="ez-toc-js-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/custom-script.js" id="custom-script-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/magnific-popup.js" id="magnific-popup-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.fitvids.js" id="jquery-fitvids-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/imagesloaded.min.js" id="imagesloaded-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/object-fit-images.js" id="object-fit-images-js"></script>
<script type="text/javascript" id="contentberg-theme-js-extra">
/* <![CDATA[ */
var Bunyad = {"custom_ajax_url":"\/journal\/javascript-i-sobytiya\/"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theme.js" id="contentberg-theme-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theia-sticky-sidebar.js" id="theia-sticky-sidebar-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.slick.js" id="jquery-slick-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jarallax.js" id="jarallax-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/masonry.min.js" id="masonry-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.masonry.min.js" id="jquery-masonry-js"></script>
</body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Mon, 09 Mar 2026 17:17:33 GMT -->