Формы и валидация

Встроенная проверка средствами браузера, собственные сообщения об ошибках и сбор данных формы в объект JSON.

Constraint Validation API Доступность FormData

Демонстрация: регистрация на курс

Не менее 8 символов, хотя бы одна буква и одна цифра.
0 / 300

Результат отправки

Форма ещё не отправлена.

Как это работает

Атрибуты вместо ручных проверок

html
<input type="email" required>
<input type="password" minlength="8" pattern="(?=.*\d)(?=.*[A-Za-z]).{8,}">
<input type="number" min="16" max="99">
<input type="url">

Свои сообщения об ошибках

js
const field = document.getElementById('fEmail');

field.addEventListener('blur', () => {
  if (field.validity.valueMissing) {
    field.setCustomValidity('Укажите электронную почту');
  } else if (field.validity.typeMismatch) {
    field.setCustomValidity('Похоже, в адресе опечатка');
  } else {
    field.setCustomValidity('');   // сбрасываем — иначе поле останется невалидным
  }
});
setCustomValidity('') нужно вызывать обязательно. Если этого не делать, поле навсегда останется невалидным.

Сбор данных

js
form.addEventListener('submit', (event) => {
  event.preventDefault();
  if (!form.checkValidity()) { form.reportValidity(); return; }
  const data = Object.fromEntries(new FormData(form));
  console.log(data);
});
Атрибут novalidate в нашем примере отключает всплывающие системные подсказки — чтобы показать собственную логику. В реальном проекте его можно и не ставить.

Задание

  1. Добавьте поле «Подтверждение пароля» и проверьте совпадение вручную через setCustomValidity.
  2. Сделайте индикатор надёжности пароля (слабый / средний / сильный) с изменением цвета.
  3. Запретите ввод цифр в поле имени через событие input.
  4. Свяжите каждое сообщение об ошибке с полем через aria-describedby для скринридеров.