Статьи

Проверка формы HTML5

Несколько месяцев назад Sandeep представил нам API ограничения HTML , демонстрируя, как мы можем использовать новые типы ввода и атрибуты HTML5 для проверки наших форм в браузере с минимальным использованием JavaScript. Сегодня я расскажу вам о том, как проверить простую форму бронирования с помощью Constraint API, и рассмотрим, как вы можете сделать так, чтобы ваши формы оставались доступными.

Напомним — или в случае, если вы еще не читали статью Сандипа — с рассветом HTML5, множество новых типов ввода и атрибутов было добавлено в теги <input> Чтобы начать использовать новые типы ввода и атрибуты, вам не нужно ничего делать, кроме как начать использовать новые типы ввода и атрибуты.

Строго говоря, вы должны убедиться, что используете HTML5 DOCTYPE, иначе вы столкнетесь с ошибками проверки HTML. Но самое замечательное в них то, что они все грациозно деградируют. Так что, если старый браузер не поддерживает их, тот факт, что они находятся в HTML, ничего не «сломает», они просто будут отображаться как <input type=”text”>

NB. Хотя проверка формы на стороне клиента отлично подходит для улучшения взаимодействия с пользователем — быстрой и мгновенной обратной связи с пользователем без совершения обратной передачи на сервер — вам все равно придется проверять любые данные, представленные на сервере.

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

 <form action="" method="post">
    <fieldset>
        <legend>Booking Details</legend>
        <div>
            <label for="name">Name (required):</label>
            <input type="text" id="name" name="name" value="" aria-describedby="name-format">
            <span id="name-format" class="help">Format: firstname lastname</span>
        </div>
        <div>
            <label for="email">Email (required):</label>
            <input type="text" id="email" name="email" value="">
        </div>
        <div>
            <label>Website:</label>
            <input type="text" id="website" name="website" value="">
        </div>
        <div>
            <label for="numTickets"><abbr title="Number">No.</abbr> of Tickets (required):</label>
            <input type="text" id="numTickets" name="numTickets" value="">
        </div>
        <div class="submit">
            <input type="submit" value="Submit">
        </div>
    </fieldset>
</form>    - <label>

https://jsfiddle.net/ianoxley/aZ9r8/1/

Обратите внимание, что каждое поле ввода имеет связанный for Атрибут for для тега label совпадает с атрибутом id соответствующего входного тега. Это сохраняет нашу семантику HTML, а метки помогают придать смысл элементам управления вводом. Это также означает, что если щелкнуть метку, связанный тег ввода получает фокус.

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

Я также использую атрибут WAI ARIA aria-describedby

 <label for="name">Name (required):</label>
<input type="text" id="name" name="name" value="" aria-describedby="name-format">
 <span id="name-format" class="help">Format: firstname lastname</span>

Это показано, когда поле ввода, которое оно описывает, получает фокус, предоставляя контекстно-зависимую помощь:

 .help {
    display:none;
    font-size:90%;
}
input:focus + .help {
    display:inline-block;
}

Для проверки этой формы нам необходимо:

  1. Убедитесь, что обязательные поля заполнены
  2. Убедитесь, что то, что введено для «Имя», похоже на имя
  3. Убедитесь, что адрес электронной почты выглядит как адрес электронной почты
  4. Убедитесь, что если указан URL-адрес веб-сайта, он выглядит как URL
  5. Убедитесь, что номер был введен в «Количество билетов»

Обязательные поля

Проверить обязательные поля так же просто, как добавить required<input> Например, имя теперь выглядит так:

 <div>
        <label for="name">Name:</label>
        <input id="name" name="name" value="" aria-describedby="name-format" required>
        <span id="name-format" class="help">Format: firstname lastname</span>
    </div>

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

Обязательный атрибут

Вы заметили, что у нас больше нет «обязательных» в обязательных полях тегов <label> Это связано с тем, что большинство программ чтения с экрана теперь выбирают required

Однако, предупреждающее слово: не все браузеры реализуют required Таким образом, текущая лучшая практика рекомендует дополнить обязательный атрибут атрибутом aria-required = ”true”:

 <input id="name" name="name" value="" aria-describedby="name-format" required aria-required=”true”/>

Проверка данных

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

Мы хотим, чтобы поле «Имя» отправлялось в формате «Имя, Фамилия» и содержало только буквы и пробел ( примечание: в сценариях реального мира может потребоваться учесть другие локали — этот пример был сохранен просто сознательно). Мы можем достичь этого, добавив атрибут шаблона в поле «Имя», установив его значение в регулярное выражение, с которым мы хотим сравнить данные:

 <input id="name" name="name" value="" aria-describedby="name-format" required aria-required=”true” pattern="[A-Za-z-0-9]+\s[A-Za-z-'0-9]+">

При использовании атрибута pattern, ^$

Вы можете помочь пользователю, включив атрибут title, который сообщает им требуемый формат:

 <input id="name" name="name" value="" aria-describedby="name-format" required aria-required=”true” pattern="[A-Za-z-0-9]+\s[A-Za-z-'0-9]+"  title="firstname lastname">

Текст в атрибуте title затем добавляется во встроенное сообщение проверки:

Атрибут шаблона

Обратите внимание, что некоторые комбинации программ чтения с экрана и браузера могут приводить к считыванию атрибута title в дополнение к тексту, описанному в aria, поэтому следите за этим, например, я обнаружил, что использование NVDA с IE10 вызвало атрибут title и текст элемента, описанного в aria. чтобы быть прочитанным, но использование NVDA с Chrome и Firefox не показывало это поведение. Только текст, описанный в арии, был прочитан. Позже мы вернемся к этому и покажем вам одно решение с использованием CSS3.

Проверка электронных писем, URL-адресов и номеров

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

 <input type="email" id="email" name="email" required>
…
<input type="url" id="url" name="url">
…
<input type="number" id="numTickets" name="numTickets" required>

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

введите адрес электронной почты

введите URL

Обратите внимание, что атрибут type Если вы не укажете его, тег inputtype="text"

Предположим, мы хотели ограничить количество билетов, которое может купить каждый человек? Мы можем сделать это, используя атрибуты maxmin

 <input type="number" min="1" max="4" id="numTickets" name="numTickets">

Если пользователь вводит что-либо меньше 1 или больше 4, ему будет предложено ввести число в допустимом диапазоне.

Макс атрибут

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

В сочетании с новыми типами ввода и атрибутами, предоставляемыми HTML5, CSS3 дает нам несколько новых псевдоклассов, которые мы можем использовать, чтобы предоставить пользователю визуальные подсказки о том, какие поля формы являются обязательными, которые являются необязательными и которые содержат ошибки проверки.

Обязательные поля могут использовать псевдокласс :required

 input:required {
    background:hsl(180, 50%, 90%);
    border:1px solid #999;
}

Необязательные поля могут использовать :optional

 input:optional {
    background:hsl(300, 50%, 90%);
    border:1px dotted hsl(180, 50%, 90%);
}

Успешность или неудача проверки формы может быть обозначена для пользователя с помощью псевдоклассов :valid:invalid:in-range:out-of-range

 input:valid,
input:in-range {
    background:hsl(120, 50%, 90%);
    border-color:hsl(120, 50%, 50%);
}

input:invalid,
input:out-of-range {
    border-color:hsl(0, 50%, 50%);
    background:hsl(0, 50%, 90%);
}

CSS3 псевдоклассы

Помните ранее, когда я упоминал, что определенные комбинации программ чтения с экрана и браузера могут привести к тому, что атрибут title будет прочитан вслух в дополнение к тексту элемента, aria-describedby Что ж, одним из способов решения этой проблемы является удаление атрибута title из элемента input и использование псевдокласса CSS3 :invalidaria-describedby

 input:focus + .help,
input:invalid + .help {
    display:inline-block;
}

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

После внесения всех этих изменений наш HTML теперь выглядит так:

 <form action="" method="post">
    <fieldset>
        <legend>Booking Details</legend>
        <div>
            <label for="name">Name:</label>
            <input id="name" name="name" value="" required  pattern="[A-Za-z-0-9]+\s[A-Za-z-'0-9]+" aria-required="true" aria-describedby="name-format">
            <span id="name-format" class="help">Format: firstname lastname</span>
        </div>
        <div>
            <label for="email">Email:</label>
            <input type="email" id="email" name="email" value="" required aria-required="true">
        </div>
        <div>
            <label for="website">Website:</label>
            <input type="url" id="website" name="website" value="">
        </div>
        <div>
            <label for="numTickets"><abbr title="Number">No.</abbr> of Tickets:</label>
            <input type="number" id="numTickets" name="numTickets" value="" required aria-required="true" min="1" max="4">
        </div>
        <div class="submit">
            <input type="submit" value="Submit">
        </div>
    </fieldset>
</form>

https://jsfiddle.net/ianoxley/VY8KU/

Отключение проверки на основе браузера

Вы можете отключить встроенную проверку браузера, добавив атрибут novalidate<form>

 <form novalidate>
    …
</form>

https://jsfiddle.net/ianoxley/9C2JD/

Кросс-браузер?

Хорошей новостью является то, что проверка формы HTML поддерживается всеми последними браузерами для настольных компьютеров и большинством мобильных браузеров. Плохая новость заключается в том, что он только частично поддерживается в Safari и совсем не поддерживается в iOS Safari или браузере Android по умолчанию. Если вам требуется поддержка более старых версий IE до IE10, вы также не найдете ни одной из этих проверок формы поддержки.

Итак, что вы можете сделать, если вам нужно поддерживать браузеры, которые еще не поддерживают проверку формы?

Один из вариантов — ничего не делать и полагаться только на проверку на стороне сервера. Это не потребует дополнительной работы с вашей стороны, но будет ли удовлетворительным UX для тех, кто использует неподдерживаемые браузеры?

Другой вариант — продолжать использовать исключительно JavaScript для проверки на стороне клиента и не добавлять какие-либо новые функции, описанные выше.

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

 // Without Moderizr
var inputElem = document.createElement('input');
if (!('required' in inputElem)) {
    // JavaScript form validation
  }

...

// With Modernizr
if (!Modernizr.input.required) {
    // JavaScript form validation
}

Вывод

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

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

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

Дайте мне знать, что вы думаете обо всем этом в комментариях.

Обучите себя HTML5 за одни выходные. Последнее руководство SitePoint по HTML5, Jump Start HTML5 , можно бесплатно прочитать с помощью ознакомительной пробной версии .