Формы — это лицо любого сайта. Но сколько раз вы заполняли поля, нажимали «Отправить» и получали ошибку после перезагрузки страницы? Раздражает. Сегодня разберем, как сделать валидацию на JavaScript, чтобы пользователь видел ошибки сразу, а сервер не захламлялся мусором. Это сэкономит время и нервы.

Зачем валидировать формы на клиенте?

Валидация на стороне клиента — это первая линия обороны. Она проверяет, что пользователь ввел email, а не «кот», и что пароль длиннее трех символов. Основные плюсы:

  • Мгновенная обратная связь — пользователь не ждет ответа сервера.
  • Меньше нагрузки на сервер — отсеиваются явные ошибки.
  • Улучшение пользовательского опыта — форма не сбрасывается после отправки.

Но помните: JavaScript можно отключить. Поэтому серверную валидацию никто не отменял. Клиентская — это удобство, а не защита.

Основы: как это работает

Валидация на JavaScript строится вокруг события submit формы. Вы вешаете обработчик, который проверяет поля и либо блокирует отправку, либо разрешает. Простейший пример:

document.getElementById('myForm').addEventListener('submit', function(event) {
    event.preventDefault();
    
    let name = document.getElementById('name').value;
    if (name.trim() === '') {
        alert('Имя не может быть пустым');
        return;
    }
    
    // Если все ок, отправляем форму
    this.submit();
});

Здесь мы отменяем стандартную отправку, проверяем поле name и показываем сообщение, если оно пустое. Просто и понятно.

Типы валидации: что проверять

Есть три основных типа проверок: обязательные поля, формат данных и сравнение значений. Разберем каждый.

ТипПримерКак проверить
Обязательное полеИмя, emailПроверить, что значение не пустое
ФорматEmail, телефонИспользовать регулярные выражения
СравнениеПароль и подтверждениеСравнить два поля

Для формата email часто используют регулярку. Пример:

function isValidEmail(email) {
    return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}

Она проверяет, что есть символ @ и точка после него. Не идеально, но для 90% случаев хватает.

Правило: Не используйте сложные регулярки для email. Лучше проверьте, что сервер может отправить письмо. Клиентская валидация — это фильтр, а не детектор лжи.

Валидация в реальном времени

Показывать ошибки после нажатия кнопки — это прошлый век. Современные формы проверяют поля сразу, как только пользователь заканчивает ввод. Используем событие blur или input.

document.getElementById('email').addEventListener('blur', function() {
    let email = this.value;
    let error = document.getElementById('emailError');
    
    if (!isValidEmail(email)) {
        error.textContent = 'Введите корректный email';
        this.style.borderColor = 'red';
    } else {
        error.textContent = '';
        this.style.borderColor = 'green';
    }
});

Здесь при потере фокуса проверяется email, и под полем появляется сообщение об ошибке или успехе. Пользователь видит результат мгновенно.

Собираем всё вместе: пример формы

Давайте напишем полноценную форму с регистрацией. HTML:

<form id="registerForm">
    <div>
        <label for="username">Имя:</label>
        <input type="text" id="username" required>
        <span id="usernameError" class="error"></span>
    </div>
    <div>
        <label for="email">Email:</label>
        <input type="email" id="email" required>
        <span id="emailError" class="error"></span>
    </div>
    <div>
        <label for="password">Пароль:</label>
        <input type="password" id="password" required>
        <span id="passwordError" class="error"></span>
    </div>
    <div>
        <label for="confirm">Подтвердите пароль:</label>
        <input type="password" id="confirm" required>
        <span id="confirmError" class="error"></span>
    </div>
    <button type="submit">Зарегистрироваться</button>
</form>

А теперь JavaScript для валидации:

document.getElementById('registerForm').addEventListener('submit', function(event) {
    event.preventDefault();
    
    let isValid = true;
    
    // Проверка имени
    let username = document.getElementById('username').value;
    if (username.trim() === '') {
        document.getElementById('usernameError').textContent = 'Имя обязательно';
        isValid = false;
    } else {
        document.getElementById('usernameError').textContent = '';
    }
    
    // Проверка email
    let email = document.getElementById('email').value;
    if (!isValidEmail(email)) {
        document.getElementById('emailError').textContent = 'Некорректный email';
        isValid = false;
    } else {
        document.getElementById('emailError').textContent = '';
    }
    
    // Проверка пароля
    let password = document.getElementById('password').value;
    if (password.length < 6) {
        document.getElementById('passwordError').textContent = 'Пароль должен быть минимум 6 символов';
        isValid = false;
    } else {
        document.getElementById('passwordError').textContent = '';
    }
    
    // Проверка подтверждения
    let confirm = document.getElementById('confirm').value;
    if (password !== confirm) {
        document.getElementById('confirmError').textContent = 'Пароли не совпадают';
        isValid = false;
    } else {
        document.getElementById('confirmError').textContent = '';
    }
    
    if (isValid) {
        // Отправляем на сервер, например через AJAX
        alert('Форма отправлена');
    }
});

function isValidEmail(email) {
    return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}

Этот код проверяет все поля перед отправкой. Если есть ошибка — форма не уходит. Пользователь видит сообщения под каждым полем.

Советы для профессионалов

  • Используйте HTML5-атрибуты required, type="email" — они работают даже без JS, но не дают гибкости.
  • Не показывайте ошибки до того, как пользователь начал ввод. Иначе форма будет выглядеть как поле боя.
  • Группируйте ошибки в одном блоке, если их много. Например, выводите список вверху формы.
  • Добавьте индикатор успеха (зеленую галочку) для каждого поля, чтобы пользователь знал, что все ок.
Лайфхак: Для сложных форм используйте библиотеки типа Parsley.js или VeeValidate. Они экономят время и покрывают 80% типовых сценариев. Но для учебных целей лучше написать самому.

Что в итоге

Валидация форм на JavaScript — это не rocket science. Достаточно повесить обработчик на submit, проверить поля и показать ошибки. Главное — не забывать про серверную проверку, потому что JavaScript — это только для удобства. Используйте живую валидацию (blur/input), чтобы пользователь не ждал конца заполнения. И помните: хорошая форма — это та, где ошибки видны сразу, а не после перезагрузки.

Студия WNDER