Unlimited Wordpress themes, plugins, graphics & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Web Design
  2. Validation
Webdesign

Проверка форм в HTML5 с помощью атрибута "pattern"

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Strange and Unusual HTML.
Native Popups and Modals With the HTML5 “dialog” Element
Quick Tip: Don’t Forget the “noscript” Element

Russian (Pусский) translation by Andrey Rybin (you can also view the original English article)

В этой статье мы рассмотрим HTML атрибут pattern, который помогает нам настроить проверку данных в форме.

Валидация

Валидация форм, как и юзабилити, имеет жизненно важное значение для безопасности сайта. В процессе проверки перед отправкой формы оцениваются значения полей input на корректный формат ввода К примеру, у нас есть поле input для ввода email’а, в таком случае значением должен выступать правильный адрес почты; адрес должен начинаться с цифры или буквы, затем знак @ и в конце доменное имя.

Спецификация HTML5 позволяет делать более легкую проверку в связи с введением новых типов таких как  email, url, или tel, и с помощью них проверка осуществляется автоматически. Если введенная величина не отвечает ожидаемому формату, эти типы выдают ошибку, в результате чего выдается сообщение об ошибке, и это предотвращает подстановку неверных данных.

Invalid email address error message
Неправильный адрес электронной почты - сообщение об ошибке  (Chrome)

Однако, ожидать полной обработки всех возможных сценариев с полем input непрактично.  Что если, у вас есть поля для имени пользователя, почтового индекса или другие специализированные типы данных, которые не относятся к типам спецификации? Как тогда проводить проверку этих полей?  Вот здесь нам и пригодиться атрибут pattern.

Использование Атрибута Pattern

Атрибут pattern используется только для input элементов.  Это позволяет нам задать собственные правила проверки, используя Регулярные Выражения (RegEx). Еще раз, если величина не будет соответствовать заданному шаблону, то ввод вызовет ошибку.

Например, скажем у нас есть форма для ввода имени пользователя. Стандартизированного типа для поля имени пользователя не существует, значит, мы воспользуемся обычным типом text:

Давайте зададим правило, которое будет использовать в атрибуте pattern. В этом случае, мы зададим, что имя пользователя должно состоять из строчных букв; без заглавных, без чисел или других символов. И кроме того, имя пользователя не должно превышать 15 символов.  По правилам регулярных выражений - это может быть записано следующим образом  [a-z]{1,15}.

Пропишите [a-z]{1,15} в качестве значения атрибута pattern для поля username:

Теперь, поскольку допустимы только строчные буквы, подстановка любых других символов вызывает сообщение об ошибке:

The error message stating the pattern is not matched
Сообщение об ошибке, говорящее что ввод не соответствующий

Как вы можете видеть выше в сообщении об ошибке сказано «Please match the requested format». То есть, наша проверка формы работает, но это сообщение не дает представление пользователю о том, какой формат ввода от него требуется.  А значит это плохой UX.

Настройка Сообщений при Проверке

К счастью, мы можем настроить сообщение, которое будет давать подсказки, и у нас есть два варианта, как это сделать.  Самый простой - это задать атрибут title для input-элемента:

Теперь заголовок появляется с текстом сообщения по умолчанию:

И все же всплывающее сообщение не очень подходит.  Если сравнить это сообщение с сообщением для поля email выше, то инструкция будет куда длиннее.

 Второй способ позволяет справиться с данной задачей.

Замена Стандартного Сообщения при Проверке

Давайте заменим стандартный вариант “Please match the requested format” собственным сообщением.  Для этого мы используем немного JavaScript.

Начнем с того, что добавим id для input элемента, чтобы мы могли легко к нему обратиться.

Теперь мы можем выбрать input элемент, используя JavaScript и и присвоить ему переменную (код ниже или между тегов script, или в отдельном JS файле, или в панели JS на CodePen):

И наконец, мы задаем сообщение, которое будет появляться при неправильном заполнении формы.

Событие oninvalid наследуется от объекта event, в котором присутствуют несколько свойств, среди которых target (элемент с неправильно введенным текстом) и validationMessage – содержит текст сообщения об ошибке. В примере выше мы переписали текст сообщения при помощи метода setCustomValidity()

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

Стилизация

Чтобы дополнить новые типы input  и новые методы для настройки проверки сообщений, в новой спецификации CSS3 созданы пара псевдоклассов - :valid и :invalid. Они позволяют нам использовать разное оформление, в зависимости от состояния проверки, например:

При использовании этих псевдоклассов необходимо помнить некоторые вещи:

  • Первое  :valid - используется по умолчанию, даже если входное значение пустое.  Как вы можете видеть выше, мы установили цвет по умолчанию border-color: #ccc;.  Пустое значение всегда проходит проверку, если не добавить атрибут required.  В таком случае значение поля становится ошибочным, и его рамка становится красной.
  • стили для valid и invalid применяются сразу же во время того как пользователь осуществляет ввод, даже если если переменная пустая.  Постоянное изменение в оформлении, может озадачить пользователя.

Несколько Слов о Стилизации Всплывающих Сообщений

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

Google Chrome убрал возможность настройки стилей всплывающего поля пару лет назад.  Если же вам необходимо стилизовать поле под себя, то остается только полностью переписать данное поле с помощью JavaScript. Давайте разберемся, как это сделать!

Усложняем Функционал

Итак, мы собираемся создать собственные всплывающие сообщения, которые появляются, если вводимая величина не верна. Для начала, нам необходимо выбрать требуемые элементы с идентификаторами input и form:

Далее, мы создадим новый элемент, который будет содержать наше сообщение:

Тут мы создали новый div-элемент.  Мы присвоили ему id со значением notify и спрятали его при помощи display: none.  В конце мы вставляем новый div в form.

Отработка Событий

У нас есть два события, с которыми мы будем иметь дело.  Первое, событие - invalid, когда ввод не совпадает с шаблоном.  В случае invalid мы запускаем следующий код:

С помощью event.preventDefault();  мы блокируем результат по умолчанию, поэтому всплывающее окно браузера не появляется.  Вместо этого мы будем показывать наше окно, используя элемент div.  Мы создали новый текст для сообщения, добавили новый класс error, и показываем сообщение используя display:block .

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

Также, вы можете добавить классы анимации shake из Animate.css.  Это добавит некоторый эффект, благодаря анимации “встряхивания”.

Второе событие - input.   Оно вызывается, когда изменяется величина в input.  Мы используем это событие, для возврата поля в нормальное состояние, а также чтобы скрыть всплывающее сообщение.

Как вы можете видеть выше, мы собираемся убрать классы для поля input и скрываем выпадающее сообщение.

Теперь у нас полностью настроенное сообщение при валидации формы.  Протестируйте то, что у нас получилось: введите любое неправильное значение:

Примечание: не забудьте заглянуть на GraphicRiver, если вы ищете что-то вдохновляющее для вашего UI дизайна.

Заключительные Мысли

Использование стандартных типов полей input и атрибута pattern, придадут вашей форме, новый уровень валидации, но  при этом не стоит и забывать про проверку на стороне сервера. 

Как ни странно даже при отключенном JavaScript, последние версии браузеров показывают всплывающее сообщение и не отправляют форму. Однако, Safari не поддерживает атрибут pattern на момент написания статьи.  Похожий функционал можно реализовать с помощью полифилла Webshim Lib

Надеюсь, вам понравился сегодняшний урок, и вы будете обращаться к этой статье при настройке проверки заполнения форм в HTML5.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.