JavaRush /Курсы /Модуль 1: Web Core /События форм

События форм

Модуль 1: Web Core
5 уровень , 8 лекция
Открыта

9.1 Основные события форм

Для обеспечения функциональности форм необходимо понимать и управлять событиями, которые происходят при взаимодействии пользователя с элементами формы. Ниже мы подробно рассмотрим основные события форм в HTML, их обработку с помощью JavaScript и примеры их использования.

В HTML формы могут генерировать различные события, которые происходят при взаимодействии пользователя с элементами формы, такими как поля ввода, кнопки, флажки и радиокнопки. Основные события форм включают:

  • submit — событие отправки формы
  • reset — событие сброса формы
  • focus — событие, когда элемент получает фокус
  • blur — событие, когда элемент теряет фокус
  • change — событие изменения значения элемента формы
  • input — событие ввода данных в элемент формы
  • select — событие выделения текста в элементе формы

9.2 Событие submit

Событие submit происходит при отправке формы. Обычно это происходит, когда пользователь нажимает кнопку "Submit" в форме. Обработка этого события позволяет выполнять валидацию данных перед отправкой их на сервер, предотвращать отправку формы при ошибках ввода и выполнять другие действия.

Пример обработки события submit:

HTML
    
        <form id="my-form" action="/submit" method="post">
          <label for="username">Имя пользователя:</label>
          <input type="text" id="username" name="username">
          <button type="submit">Отправить</button>
        </form>
    
  
JavaScript
    
      const form = document.getElementById('my-form'); // getElementById — позволяет получить доступ к элементу страницы по его id.

      form.addEventListener('submit', function(event) { // addEventListener — реагирует на действия пользователя или события браузера.
        const username = document.getElementById('username').value;
        if (username === '') {
          alert('Пожалуйста, введите имя пользователя.');
          event.preventDefault(); // предотвращаем отправку формы
        } else {
          alert(`Получено имя пользователя: ${username}`);
          event.preventDefault();
        }
      });
    
  
JavaScript
    
      const form = document.getElementById('my-form'); // getElementById — позволяет получить доступ к элементу страницы по его id.

      form.addEventListener('submit', function(event) { // addEventListener — реагирует на действия пользователя или события браузера.
        const username = document.getElementById('username').value;
        if (username === '') {
          alert('Пожалуйста, введите имя пользователя.');
          event.preventDefault(); // предотвращаем отправку формы
        }
      });
    
  

9.3 Событие reset

Событие reset происходит при сбросе формы до ее первоначального состояния. Обычно это происходит, когда пользователь нажимает кнопку "Reset". Обработка этого события может быть полезна для выполнения дополнительных действий при сбросе формы, таких как очистка сообщений об ошибках.

Пример обработки события reset:

HTML
    
      <div style="min-height: 220px">
        <form id="my-form">
          <label for="name">Name:</label>
          <br>
          <input type="text" id="name" name="name">
          <br><br>
          <label for="email">Email:</label>
          <br>
          <input type="email" id="email" name="email">
          <br><br>
          <label for="password">Password:</label>
          <br>
          <input type="password" id="password" name="password">
          <div style="margin-top: 10px">
            <button id="btn" type="button">Сбросить</button>
          </div>
        </form>
        <p id="log"></p>
      </div>
    
  
HTML
    
      <form id="my-form">
        <label for="name">Name:</label>
        <br>
        <input type="text" id="name" name="name">
        <br><br>
        <label for="email">Email:</label>
        <br>
        <input type="email" id="email" name="email">
        <br><br>
        <label for="password">Password:</label>
        <br>
        <input type="password" id="password" name="password">
        <div style="margin-top: 10px">
          <button type="reset">Сбросить</button>
        </div>
      </form>
      <p id="log"></p>
    
  
JavaScript
    
      const form = document.getElementById('my-form'); // getElementById — позволяет получить доступ к элементу страницы по его id.
      const btn = document.getElementById('btn');
      const n = document.getElementById('name');
      const e = document.getElementById('email');
      const p = document.getElementById('password');
      const log = document.getElementById('log');

      document.addEventListener('DOMContentLoaded', () => { // addEventListener — реагирует на действия пользователя или события браузера.
        n.value = "John";
        e.value = "john@mail.com";
        p.value = "qwerty";
      });

      btn.addEventListener('click', () => {
        n.value = "";
        e.value = "";
        p.value = "";
        log.textContent = 'Форма была сброшена!';
      });
    
  
JavaScript
    
      const form = document.getElementById('my-form'); // getElementById — позволяет получить доступ к элементу страницы по его id.
      const log = document.getElementById('log');

      form.addEventListener('reset', function () { // addEventListener — реагирует на действия пользователя или события браузера.
        log.textContent = 'Форма была сброшена!';
      });
    
  

9.4 События focus и blur

События focus и blur происходят, когда элемент формы получает и теряет фокус соответственно. Эти события часто используются для улучшения взаимодействия пользователя с формой, например, для отображения подсказок или сообщений об ошибках.

Пример обработки события focus:

HTML
    
      <div style="min-height: 55px">
        <form id="my-form">
          <label for="username">Имя пользователя:</label>
          <input type="text" id="username" name="username">
          <div id="username-hint" style="display: none;">
            Вы увидите эту подсказу в момент фокуса на поле.
            Она будет видна даже после смены фокуса.
          </div>
        </form>
      </div>
    
  
HTML
    
      <form id="my-form">
        <label for="username">Имя пользователя:</label>
        <input type="text" id="username" name="username">
        <div id="username-hint" style="display: none;">
          Вы увидите эту подсказу в момент фокуса на поле.
          Она будет видна даже после смены фокуса.
        </div>
      </form>
    
  
JavaScript
    
      const form = document.getElementById('my-form'); // getElementById — позволяет получить доступ к элементу страницы по его id.
      const usernameInput = document.getElementById('username');
      const hint = document.getElementById('username-hint');

      form.addEventListener("submit", (event) => { // addEventListener — реагирует на действия пользователя или события браузера.
        event.preventDefault();
      });

      usernameInput.addEventListener('focus', function (event) {
        hint.style.display = 'block';
      });
    
  
JavaScript
    
      const usernameInput = document.getElementById('username'); // getElementById — позволяет получить доступ к элементу страницы по его id.
      const hint = document.getElementById('username-hint');

      usernameInput.addEventListener('focus', function () { // addEventListener — реагирует на действия пользователя или события браузера.
        hint.style.display = 'block';
      });
    
  

Пример обработки события blur:

HTML
    
      <div style="min-height: 55px">
        <form id="my-form">
          <label for="username">Имя пользователя:</label>
          <input type="text" id="username" name="username">
          <div id="username-error" style="display: none; color: red;">
            Ошибка появится только в случае, если поле будет пустым после смены фокуса
          </div>
        </form>
      </div>
    
  
HTML
    
      <form id="my-form">
        <label for="username">Имя пользователя:</label>
        <input type="text" id="username" name="username">
        <div id="username-error" style="display: none; color: red;">
          Ошибка появится только в случае, если поле будет пустым после смены фокуса
        </div>
      </form>
    
  
JavaScript
    
      const form = document.getElementById('my-form'); // getElementById — позволяет получить доступ к элементу страницы по его id.
      const usernameInput = document.getElementById('username');
      const error = document.getElementById('username-error');

      form.addEventListener("submit", (event) => { // addEventListener — реагирует на действия пользователя или события браузера.
        event.preventDefault();
      });

      usernameInput.addEventListener('blur', function (event) {
        error.style.display = usernameInput.value === '' ? 'block' : 'none';
      });
    
  
JavaScript
    
      const usernameInput = document.getElementById('username'); // getElementById — позволяет получить доступ к элементу страницы по его id.
      const error = document.getElementById('username-error');

      usernameInput.addEventListener('blur', function () { // addEventListener — реагирует на действия пользователя или события браузера.
        error.style.display = usernameInput.value === '' ? 'block' : 'none';
      });
    
  

9.5 Событие input

Событие input происходит каждый раз, когда значение элемента формы изменяется, независимо от того, теряет ли элемент фокус. Это событие часто используется для немедленной проверки ввода пользователя, например, при валидации полей ввода в режиме реального времени.

Пример обработки события input:

HTML
    
      <html lang="ru">
        <head>
          <style>
            input {
              outline: none;
            }

            .valid {
              border-color: green;
            }

            .invalid {
              border-color: red;
            }

            .wrapper-valid::after {
              content: "Email валидный";
              margin-left: 5px;
              color: green;
            }

            .wrapper-invalid::after {
              content: "Email не валидный";
              margin-left: 5px;
              color: red;
            }
          </style>
        </head>
        <body>
          <form id="my-form">
            <label for="email">Email:</label>
            <div id="wrapper">
              <input type="email" id="email" name="email">
            </div>
          </form>
        </body>
      </html>
    
  
JavaScript
    
      const form = document.getElementById('my-form'); // getElementById — позволяет получить доступ к элементу страницы по его id.
      const inputWrapper = document.getElementById('wrapper');
      const emailInput = document.getElementById('email');

      form.addEventListener("submit", (event) => {
        event.preventDefault();
      });

      emailInput.addEventListener('input', function () { // addEventListener — реагирует на действия пользователя или события браузера.
        const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

        if (emailPattern.test(emailInput.value)) {
          inputWrapper.classList.add('wrapper-valid');
          inputWrapper.classList.remove('wrapper-invalid');
          emailInput.classList.add('valid');
          emailInput.classList.remove('invalid');
        } else {
          inputWrapper.classList.add('wrapper-invalid');
          inputWrapper.classList.remove('wrapper-valid');
          emailInput.classList.add('invalid');
          emailInput.classList.remove('valid');
        }
      });
    
  
JavaScript
    
      const emailInput = document.getElementById('email'); // getElementById — позволяет получить доступ к элементу страницы по его id.
      const inputWrapper = document.getElementById('wrapper');

      emailInput.addEventListener('input', function () { // addEventListener — реагирует на действия пользователя или события браузера.
        const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

        if (emailPattern.test(emailInput.value)) {
          emailInput.classList.add('valid');
          emailInput.classList.remove('invalid');
        } else {
          emailInput.classList.add('invalid');
          emailInput.classList.remove('valid');
        }
      });
    
  

9.6 Событие select

Событие select происходит, когда пользователь выделяет текст в элементе формы, таком как поле ввода или текстовое поле. Это событие может быть полезно для выполнения действий при выделении текста, например, для отображения кнопки копирования.

Пример обработки события select:

HTML
    
      <div style="min-height: 55px">
        <form id="my-form">
          <label for="text-input">Введите текст:</label>
          <input type="text" id="text" name="text">
          <div id="select-message"></div>
        </form>
      </div>
    
  
HTML
    
      <form id="my-form">
        <label for="text-input">Введите текст:</label>
        <input type="text" id="text" name="text">
        <div id="select-message"></div>
      </form>
    
  
JavaScript
    
      document.addEventListener('DOMContentLoaded', function () { // addEventListener — реагирует на действия пользователя или события браузера.
        const form = document.getElementById('my-form'); // getElementById — позволяет получить доступ к элементу страницы по его id.
        const textInput = document.getElementById('text');
        const selectMessage = document.getElementById('select-message');

        form.addEventListener("submit", (event) => {
          event.preventDefault();
        });

        textInput.addEventListener('select', function () {
          selectMessage.textContent = 'Вы выделили текст!';
        });
      });
    
  
JavaScript
    
      document.addEventListener('DOMContentLoaded', function () { // addEventListener — реагирует на действия пользователя или события браузера.
        const textInput = document.getElementById('text'); // getElementById — позволяет получить доступ к элементу страницы по его id.
        const selectMessage = document.getElementById('select-message');

        textInput.addEventListener('select', function () {
          selectMessage.textContent = 'Вы выделили текст!';
        });
      });
    
  

9.7 Событие change

Событие change происходит, когда значение элемента формы изменяется, и пользователь покидает элемент (теряет фокус). Это событие часто используется для проверки изменений в полях формы, таких как выпадающие списки или флажки.

Пример обработки события change:

HTML
    
      <form id="my-form">
        <label for="color-select">Выберите цвет:</label>
        <select id="color-select" name="color">
          <option value="red">Красный</option>
          <option value="green">Зеленый</option>
          <option value="blue">Синий</option>
        </select>
      </form>
    
  
JavaScript
    
      document.addEventListener('DOMContentLoaded', function () { // addEventListener — реагирует на действия пользователя или события браузера.
        const form = document.getElementById('my-form'); // getElementById — позволяет получить доступ к элементу страницы по его id.
        const selectElement = document.getElementById('color-select');

        form.addEventListener("submit", (event) => {
          event.preventDefault();
        });

        selectElement.addEventListener('change', function () {
          alert('Вы выбрали цвет: ' + selectElement.value);
        });
      });
    
  
JavaScript
    
      document.addEventListener('DOMContentLoaded', function () { // addEventListener — реагирует на действия пользователя или события браузера.
        const selectElement = document.getElementById('color-select'); // getElementById — позволяет получить доступ к элементу страницы по его id.

        selectElement.addEventListener('change', function () {
          alert('Вы выбрали цвет: ' + selectElement.value);
        });
      });
    
  
1
Задача
Модуль 1: Web Core, 5 уровень, 8 лекция
Недоступна
Сброс формы
Сброс формы
1
Задача
Модуль 1: Web Core, 5 уровень, 8 лекция
Недоступна
Подсказки
Подсказки
Комментарии (23)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #6512614 Уровень 11
9 июля 2026
я не понимаю зачем давать задачи по материалу который еще не учили, вот в этой теме как решить второе задание вообще не поняла(((
Сергей Уровень 23
27 июня 2026
Неожиданное задание, но ничего сложного, объяснений на первый раз хватает. Программа здесь построена так, что мы возвращаемся к пройденному материалу, но на более глубоком уровне. Когда, напр. JS подойдем, синтаксис будет уже отчасти знаком.
Sp1inter Уровень 10
4 июня 2026
как же здорово, надеюсь следующая задача будет "приготовить пингвина в домашних условиях"
Anastazja Уровень 34
21 декабря 2025
Я осознаю, что у меня недостаточно понимания JavaScript и принципов последовательного написания кода
Top_Gun_Mos Уровень 3
18 июня 2025
зачем добавлять такое задание, если еще не проходили JS?
Сергей Уровень 23
27 июня 2026
По-моему очень разумный прием: постепенно приучать студентов к синтаксису.
Foxia_#3533149 Уровень 13
1 июня 2025
странное задание если еще не проходили JavaScript
Муса Романюк Уровень 66
30 апреля 2025
У меня в пример Input не выходит сообщение о валидности почты, только рамка цвет меняет
Артём Васенин Уровень 1
27 января 2025
нет времени объяснять что такое eventListener просто пишите код!)
Павел Уровень 19 Expert
28 января 2025
Ну да сперва реши задачу, а потом тебе объяснят как ты ее решил. Может быть)
Виктор Рябов Уровень 21
8 февраля 2025
Виктор Рябов Уровень 21
8 февраля 2025
просто вбиваешь eventListener в поисковую строку, читаешь выдачу
Павел Уровень 19 Expert
10 февраля 2025
Вот, Виктор уже начал объяснять)
14 февраля 2025
Мало понять просто eventListener, надо понять накой он нужен и какую роль выполняет, если кратко то: существует некие такие языки программирования как javascript и python, без всяких библиотек они имеют возможность обрабатывать функции только по очереди (однопоточные), для этого создается стек - стек это структура односвязного списка которая формируется по принципу первая задача пришла - последней выполнилась, и так же формируют некую очередь которая так же формируется по принципу списка но только наоборот - первая задача пришла - первая и попала в стек. А теперь как все это работает в рамкая html и javascript - допустим на html страничке есть некая кнопка при нажатии на которую должна вылетать картинка на весь экран, вы описываете элемент html в котором указываете функцию javascript которая должна выполниться при нажатии на кнопку, пишите в скрипте код соответствующий и решили проверить, вот тут и начинается магия!---- 1. вы нажимаете кнопку. 2. eventListener javascripta активируется и отправляет определенную функцию (callback) с задачей которая указана в коде браузеру. 3. Браузер помещает эту задачу в очередь. 4. Затем активируется eventloop (обработчик событий) который постоянно следи за наличием обьектов в очереди и в стеке, он помещает эту задачу в стек где она согласно очереди (первая пришла последняя вышла) и выполняется.. 5. И после того как она прошла выполнение мы видим результат (наша картинка отобразилась) Это если совсем просто сказать про эти вещи. Но язык javascript выполняет все свои обработки непосредственно на стороне клиента, а вот например тот же python обрабатывает все это сразу за всех клиентов на сервере и по этому важно разгрузить сервер на клиентскую часть если это возможно!
14 февраля 2025
Конкретнее: язык питон со своим фреймворком джанго ставится на сервер - это комп но мощный (больше ядер, больше частоты на ядре) Так как питон тоже однопоточный из коробки то обычно на него накатывают многопоточность в формате дополнительных библиотек его принцип образно становится таким - 1 пользователь занимает 1 поток - допустим у нас сервер с 12 ядрами физическим это 24 потока (+12 виртуальных ядер). и выполнение происходит так: приходит пользователь (а) и занимает поток своей задачей, пока тот поток занят то 23 другие свободные и они также заполняются другими пользователями, со временем некоторые пользователи завершают выполнение события и поток занимается другим, это круто когда нужно разделение например 1 пользователь качает фильм и долго занимает поток, в то время как другой скачал картинку и быстро завершил сценарий, но для максимально обслужить множетво пользователей с таким подходом очень дорого!!! так как много ядер надо на сервере, и тут вступает в дело ассинхронность которая позволяет на одном потоке размещать несколько пользователей и работать будет так: 1 поток - 1 пользователь качает фильм, 2рой быстро влетел и качает картинку, а третий качает песню - но все трое не могут качать что то одно! ассинхронность позволяет использовать разные функции внутри одного потока! тем самым нам становится важным иметь высокую частоту ядра для стабильного выполнения несколькиз задач и это выгоднее чем покупать несколько серверов но с большим количеством ядер! весь возможный функционал переносят на клиентскую часть : 1. не забитый стек ведь информаци на сервере также обрабатывается с помощью eventListener и eventloop 2. не бесконечная очередь. 3. Удешевление ресурсов аренды железа
Foxia_#3533149 Уровень 13
1 июня 2025
к этому заданию я думаю это лишняя инфа .. а вот позже когда начнется JavaScript, это очень даже информативненько !!!
Anonymous #2943663 Уровень 11
8 октября 2025
никакая информация не бывет лишней. Он все по существу говорит. Я как раз на асинхронности зависаю и не понимаю как это на практике работает.
Vadim Makarenko Уровень 42
23 января 2025
В примере на событие Select ошибка: label должна ссылаться на id тега input. А они разные.
Vadim Makarenko Уровень 42
22 января 2025
Пример на событие Reset не совсем корректен, т.к. в коде не отображается использование предустановленных значений полей, которые присутствуют на экране. Хотя понятно, что это несущественно для иллюстрации сути происходящего.
Олег Сычев Уровень 9
25 августа 2025
Смотрю, Вы уже 40-ой уровень, как вам курс в итоге? Обучились основам html, css, js?
Vadim Makarenko Уровень 42
25 августа 2025
Курс сырой, впечатление такое, что надёрган на скорую руку из кусков других курсов, т.к. части зачастую повторяются, а задачи даются на знания последующих частей. Нумерация разделов и глав в них часто путанная. Однако при условии дополнительного изучения материалов в сети он полезен. Конечно к 40-у уровню определённое представление о предмете курса появилось, хотя ясно, что это основы. Ещё копать и копать...
Олег Сычев Уровень 9
25 августа 2025
Спасибо за ответ! Интересует особенно JavaScript - он насколько хорошо объясняется? Видел, что он начинается уже с 30+ уровня, все по порядку или внезапно влетаем и надо гуглить гуглить гуглить? Мне здесь понравился курс по Java, по Вебу пока вызывает вопросы.
Vadim Makarenko Уровень 42
26 августа 2025
В том-то и дело, что часто приходится гуглить: то объяснений недостаточно, то они обнаруживаются значительно позже задач. В моём конспекте сплошные перекрёстные ссылки на куски раньше или позже текущего и на вставки из Хабра, Доки и других источников. Особенно раздражали скрипты, данные в качестве примеров в разделе об HTML и CSS. Но пока терпимо.