Кастомизация сообщений валидации формы HTML5: JS решение

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для персонализации оповещений о валидации используйте метод setCustomValidity в сочетании с атрибутом required и обработчиками событий oninvalid и oninput. Вот как это выглядит на практике:

HTML
Скопировать код
<input required oninvalid="this.setCustomValidity('Введите требуемые данные')" oninput="this.setCustomValidity('')">

Таким образом, при неуспешной валидации поля ввода пользователь будет видеть подготовленное сообщение, которое исчезнет при начале редактирования поля.

Кинга Идем в IT: пошаговый план для смены профессии

Реализация различных уведомлений валидации

Чтобы настроить разнообразные сообщения для каждого отдельного случая, используйте функцию InvalidInputHelper:

JS
Скопировать код
function InvalidInputHelper(inputElement, options) {
  inputElement.oninvalid = function(e) {
    let message = "";
    if (!this.value) {
      message = options.emptyMessage;
    } else if (!this.validity.valid) {
      message = options.invalidMessage;
    }
    this.setCustomValidity(message);
  };
  
  inputElement.oninput = function(e) {
    this.setCustomValidity('');
  };
}

Теперь вы можете задействовать эту функцию для установки нужных сообщений:

JS
Скопировать код
InvalidInputHelper(document.getElementById('myInput'), {
  emptyMessage: "Похоже, вы забыли внести данные!",
  invalidMessage: "Ой, здесь кажется ошибка."
});

Детализация ошибок валидации

Чтобы ясно и точно указать пользователям на ошибку, используйте атрибут pattern и метод setCustomValidity, как показано ниже:

HTML
Скопировать код
<input 
  type="email" 
  required
  oninvalid="this.setCustomValidity(this.value ? 'Пожалуйста, проверьте корректность адреса электронной почты.' : 'Нам нужен ваш email!')"
  oninput="this.setCustomValidity('')"
  pattern="[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-z]{3}"
>

Немедленная обратная связь

Сделайте вашу форму более интерактивной с помощью немедленных сообщений об ошибках:

HTML
Скопировать код
<input
  type="text"
  required
  oninvalid="this.setCustomValidity('Есть определенные правила для выбора имен пользователей, обратите на них внимание!')"
  oninput="this.setCustomValidity('')"
  pattern="^[a-zA-Z0-9_.-]*$"
>

Использование атрибутов данных для индивидуализации сообщений

Чтобы сделать код более модульным и избежать повторения, используйте атрибуты данных для хранения уведомлений о валидации:

HTML
Скопировать код
<input
  type="text"
  required
  data-empty-message="Это поле нуобходимо заполнить"
  data-invalid-message="Недопустимое имя пользователя"
  pattern="^[a-zA-Z0-9_.-]*$"
>

Вот как обработать их для всех обязательных полей одновременно:

JS
Скопировать код
document.querySelectorAll('input[required]').forEach(function(input) {
  input.oninvalid = function() {
    var message = this.value ? this.dataset.invalidMessage : this.dataset.emptyMessage;
    this.setCustomValidity(message);
  };
  input.oninput = function() {
    this.setCustomValidity('');
  };
});

Совместимость с браузерами

Приведенный выше способ настроек совместим со всеми основными браузерами, включая Chrome, Internet Explorer, Edge, Firefox и Opera.

Визуализация

Пока в классе не было системы валидации, общение в нем напоминало беспорядочный детский разговор. После внедрения стало походить на тщательно организованную дискуссию, где каждый ждет своей очереди:

HTML
Скопировать код
<input type="text" required oninvalid="this.setCustomValidity('Ответьте, пожалуйста, на вопрос')" />

Учет доступности

Оставайтесь внимательными к вопросу доступности вашего приложения. Используйте атрибуты ARIA и полные описания, тестируйте работу с со скринридерами для гарантии того, что сообщения будут восприниматься четко и ясно.

Проверка на стороне сервера

Не стоит забывать, что валидация на клиентской стороне улучшает UX, в то время как проверка на сервере необходима для сохранения целостности данных и обеспечения безопасности. Серверная проверка дополняет клиентскую, но не заменяет ее.