HTML формы. HTML5: атрибут формы required

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

HTML формы могут казаться простыми, но они необходимы для большинства веб-сайтов и приложений. В HTML4 типы полей ввода были ограничены следующим списком:

  • input type="text"
  • input type="checkbox"
  • input type="radio"
  • input type="password"
  • input type="hidden" - для данных, невидимых пользователю
  • input type="file" - для загрузки файлов
  • textarea - для ввода больших объемов текста
  • select - для выпадающих списков
  • button — обычно используется для отправки данных формы, но также можно использовать input type="submit" и input type="image"

К тому же:

  • возможности стилизации с помощью CSS ограничены
  • расширенные элементы, вроде элементов для выбора даты и цвета нужно реализовывать самостоятельно, с помощью кода
  • валидация на стороне клиента требует JavaScript
Дополнительные типы полей

В HTML5 было введено огромное количество новых типов полей. Они предоставляют нативные помощники ввода и валидации без JavaScript-кода

Тип Описание
email ввод email-адреса
tel ввод телефонного номера - нет строгого синтаксиса, но разрывы строк будут удалены
url ввод URL
search поле поиска с разрывами строк автоматически удаляется
number число с плавающей точкой
range элемент управления для ввода примерного значения, обычно представляемого с помощью слайдеров
date ввод дня, месяца и года
datetime ввод дня, месяца, года, часа, минуты, секунды и микросекунды относительно текущей временной зоны
datetime-local ввод даты и времени без временной зоны
month ввод месяца и года без временной зоны
week ввод номера недели без временной зоны
time ввод времени без временной зоны
color выбор цвета
Атрибуты полей ввода

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

конечно, можно и добавить таковые, если вам нравится синтаксис в стиле XHTML, например

Атрибут Описание
name имя поля ввода
value изначальное значение
checked делает флажок или переключатель выбранным
maxlength Максимальная длина вводимой текстовой строки. В HTML5 также может быть применена и для полей textarea
minlength Минимальная длина строки. Данная возможность документирована, но на момент написания поддержка браузерами слабая, и HTML валидаторы ругаются. Альтернативный вариант использования - pattern=".{3,}", что проверит на наличие минимум трех символов во вводимой строке
placeholder ненавязчивая подсказка внутри поля
autofocus устанавливает фокус на указанный элемент (видимый) при загрузке страницы
required указывает, что в поле должно быть введено значение (не пустое поле)
pattern проверяет значение на соответствие регулярному выражению
min минимальное разрешенное значение (числовое и дата)
max максимальное разрешенное значение (числовое и дата)
step шаг изменения значения. Например, input type="number" min="10" max="19" step="2" разрешит только значения 10, 12, 14, 16 или 18
autocomplete указывает браузеру подсказку к автодополнению, например “расчетный счет”, или может быть выставлен в значение “on” или “off”, для включения/отключения овтозаполнения
inputmode

указывает способ ввода. Наиболее полезные возможности:

  • verbatim - содержимое с дословной передачей смысла, например имена пользователей
  • latin - латиница, например, поля поиска
  • latin-name - имена, то есть с заглавной первой буквой
  • latin-prose - содержимое с не дословной передачей смысла, например сообщения, твиты, прочее.
  • numeric - числовые значения, где не подходят типы number и range , например, номера кредитных карт
size размер в количестве символов для полей типа text или password, или количество пикселей для полей типа email, tel, url или search. Наверное, стоит избегать, и использовать стилизацию посредством CSS
rows Количество текстовых строк (только для textarea)
cols количество рядов символов (только для textarea)
list ссылается на список опций
spellcheck установить в true или false, чтобы включить/отключить проверку привописания для поля
form идентификатор форму, которой принадлежит данное поле. Вообще-то поля должны размещаться внутри формы, но этот атрибут позволяет разместить поле за пределами формы, в любом месте страницы
formaction указывает URI, переопределяющее действие формы при отправке данных (только для кнопок отправки/изображений)
formmethod задает GET или POST, переопределяет атрибут формы method (только для кнопок отправки/изображений)
formenctype указывает тип содержимого при отправке (text/plain, multipart/form-data или application/x-www-form-urlencoded, толкьо для кнопок отправки и изображений)
formtarget указывает целевое окно/фрейм для переопределения атрибута формы target при отправке (только для кнопок отправки / изображений)
readonly значение поля не может быть изменено, хотя оно будет отвалидировано и отправлено
disabled отключает поле ввода - нет валидации, и данные не будут отправлены

Заметьте, что поля date должны использовать формат YYYY-MM-DD для атрибутов value, min и max.

Следующий пример показывает поле, требующее обязательного ввода email, заканчивающегося на @mysite.com, на которое смещается фокус при загрузке страницы.

Списки данных

Список данных содержит набор подходящих значений для любого типа поля, например:

Если поддерживается datalist, браузер предоставляет список значений для автозаполнения, как только вы начинаете вводить данные в поле. Полный список обычно отображается при клике на стрелку, указывающую вниз (если таковая имеется). В отличие от стандартного выпадающего списка, пользователь может вводить произвольные значения в поле.

Возможно указывать значения и текстовые пояснения к значениям, например:

Internet Explorer

но стоить помнить, что реализация отличается в различных браузерах. Например, Firefox производит автодополнение по тексту (Internet Explorer), тогда как Chrome - по значениям (IE), а текст указывает уменьшенным серым шрифтом:

Списки данных можно заполнять с помощью JavaScript, если вы хотите получать их по AJAX.

Отключение валидации

Отключит валидацию всей формы можно выставив атрибут novalidate элементу form. В дополнение, можно выставить атрибут formnovalidate кнопке/изображению отправки формы.

Запомните, что выставление полю атрибута disabled отключит валидацию этого поля.

Поля вывода

Ранее мы обсуждали поля ввода, но HTML5 также предоставляет поля для вывода информации

  • output - результат вычисления пользовательских действий
  • progress - полоса прогресса (атрибуты value и max задают состояние)
  • meter - шкала, которая может менять свой цвет между зеленым, желтым и красным в зависимости от установленных значений атрибутов value, min, max, low, high и optimum
Разделение и подпись полей

Согласно спецификации , каждый элемент формы считается параграфом, и отделяется от остальных частей элементом

Итересно. Я в целях разделения использую div, хотя сомневаюсь, что это имеет большое значение. Тег p короче, разве что вам нужно будет применять дополнительный стиль, чтобы убрать поля.

Что более важно - метки нужно использовать, либо окружая элемент формы, либо размещая их рядом, и связывая их атрибутом for с соответствующими полями, например:

Имя

Фамилия

Email адрес

Подпишитесь на рассылку

Элементы управления не стандартизированы

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

Поддержка браузерами

Не все типы полей и атрибуты поддерживаются во всех браузерах. Говоря в общем, все современные браузеры, начиная с IE10+, включают в себя поддержку основных типов полей, вроде email или числовых полей. Но на момент написания статьи поля типа дата/время поддерживаются только в браузерах на движках Webkit и Blink.

Для не поддерживаемых типов полей браузер откатится до стандартного поля ввода типа text, а не поддерживаемые атрибуты и их значения проигнорирует.

Всегда используйте правильный тип!

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

Рассмотрим даты. Поддержка в браузерах неоднородна, и это приводит к проблемам при внедрении.

  • Стандартное поле date всегда возвращает дату в формате YYYY-MM-DD, независимо от того, какой формат даты используется в вашем регионе.
  • IE и Firefox откатятся до стандартного поля text, а вашим пользователям нужно вводить даты в английском формате MM-DD-YYYY, или в европейском DD-MM-YYYY
  • JavaScript плагин, как в jQuery UI позволяет определять собственный формат - да хоть YYYY-MM-DD - но вы не можете гарантировать, что JavaScript будет включен на машине пользователя.
  • Простым решением будет отказ от использования HTML5 поля date, вернутья к полю text, и реализовать свой элемент управления датами. Не делайте этого. Вы никогда не создадите нормальный элемент для выбора даты, который работает на всех устройствах, на всех разрешениях экрана, поддерживает клавиатуру, мышь и сенсорный ввод, и продолжает работать при отключенном JavaScript. К тому же, в мобильных браузерах есть свои инструменты обработки элементов управления с заточкой под сенсорное управление.

    За типами полей ввода HTML5 будущее. Используйте их, и, если необходимо, пользуйтесь JavaScript заменой в ситуациях, требующих хорошей кроссбраузерности. Но помните о том, что требуется...

    Валидация на серверной стороне

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

    • багов браузера или ошибок в JavaScript, пропускающих неверные данные
    • пользователей, изменяющих DOM или скрипты с помощью инструментов браузера
    • отправка данных с систем, которые вы не контролируете
    • перехват данных на пути от браузера к серверу (обычно по HTTP)

    Валидация на стороне клиента никогда не была и не будет заменой валидации на стороне сервера. Валидация пользовательских данных на стороне сервера имеет большое значение. Валидация на стороне клиента - дополнительная полезная возможность.

    И, наконец, помните, что даты могут быть получены в различных форматах, будь то YYYY-MM-DD, MM-DD-YYYY, DD-MM-YYYY и прочие. Проверяйте наличие цифр в первых четырех символах, или используйте встроенные средства разбора и проверки используемого языка/фреймворка в случае необходимости.

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

    • Перевод

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

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

    Говоря о формах, тут возможности CSS довольно ограничены. И теперь на сцену снова выходит HTML5. Следуя тому же принципу, он вводит новые функции, которые на самом деле вовсе не новые, но сделаны проще и удобнее.

    Нетрудно догадаться, что прежде они были частью отдельной спецификации WHATWG под названием Web Forms 2.0.

    Текст-заглушка Существует распространенный шаблон для оформления поисковых форм:
  • Если поле пусто - вставить туда текст-заглушку.
  • Когда поле в фокусе - убрать заглушку.
  • Если пользователь оставил поле незаполненным и убрал фокус - вернуть ее.
  • При этом заглушка обычно выделяется немного более светлым цветом, чем вводимый в поле текст, что достигается при помощи CSS, JavaScript, или сочетания обоих.

    В HTML5 все это реализуется при помощи простого параметра placeholder :

    Your hobbies

    Так это будет выглядеть в браузере. Owl stretching - текст по умолчанию, приведенный в качестве примера.
    В тех браузерах, что поддерживают этот атрибут, он работает прекрасно, но их пока не так много. Вам решать, что делать с остальными. В принципе, можно не напрягаться и не делать ничего совсем - данная функция все-таки хоть и удобна и приятна, но не жизненно важна. Но как вариант, можно разработать JavaScript-альтернативу; в этом случае сначала нужно будет убедиться, что браузер действительно не поддерживает placeholder .

    Вот пример простой функции, которая проверяет поддержку определенного параметра:

    Function elementSupportsAttribute(element,attribute) { var test = document.createElement(element); if (attribute in test) { return true; } else { return false; } }
    Она создает «фантомный» элемент в памяти - не на самой странице, - и затем смотрит, есть ли у прототипа этого элемента свойство с тем же же названием, что и параметр, которые вы проверяете. Функция вернет либо true , либо false .

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

    If (!elementSupportsAttribute("input","placeholder")) { // Заглушка при помощи JavaScript описывается здесь. }

    Автофокус «Привет, я функция автофокуса. Я знакома вам по таким ролям, как Google: мне повезет и Twitter: What’s happening? »

    Этот шаблон очень прост и относительно легко реализуется в JavaScript. Суть его в том, что, когда страница загружена, нужно автоматически поставить фокус на определенном поле.

    HTML5 позволяет использовать для этого булев параметр autofocus :

    What"s happening?
    Проблема только в том, что эта функция может ужасно раздражать. Очень часто, листая страницы в интернете, я использую клавишу пробела для быстрой прокрутки содержимого. На сайтах вроде Твиттера с этим автофокусом, я часто обнаруживаю, что вместо прокрутки заполняю поле пробелами.

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

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

    Так же как и с параметром placeholder можно проверить наличие поддержки автофокуса в браузере и, при необходимости, добавить альтернативный код на JavaScript:

    If (!elementSupportsAttribute("input","autofocus")){ document.getElementById("status").focus(); }
    Параметр autofocus можно применить не только к элементам input , но к любым другим типам полей, например textarea или select . И, разумеется, только единожды на странице.

    Required JavaScript часто используется для проверки заполненности формы на стороне клиента. Снова, часть этой задачи теперь переложена на HTML5. Теперь можно указать, что определенное поле обязательно к заполнению при помощи булева параметра required .

    Ваш пароль
    Теоретически, наличие незаполненного поля с этим параметром само себе должно не дать пользователю отправить данные на обработку. Но хотя пока браузеры этого и не делают, его все равно можно интегрировать для привычной обработки форм JavaScript-ом. Просто теперь вместо отбора элементов по, скажем class=«required» , можно искать их по конкретно параметру required .

    Автозаполнение Современные браузеры не столько просто отображают веб-страницы, но и стараются повысить юзабилити, безопасность и удобство пользования ими. Функция автозаполнения форм - пример такого подхода. Большую часть времени она довольно полезна, но иногда может немного раздражать или даже быть потенциальным риском для безопасности. Я не против, когда браузер запоминает мои контактные данные, но я бы не хотел, чтобы он хранил логин и пароль от моего банковского счета на случай, если компьютер украдут.

    HTML5 позволяет отключить автозаполнение как для отдельного поля, так и для целой формы. Параметр autocomplete - не булев, хоть и принимает всего два значения: on и off .


    По умолчанию он установлен на on , таким образом позволяя браузерам использовать автозаполнение без ограничений.

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


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

    Может показаться странным, что ее включили в HTML5, учитывая, что она не особо распространена. Но она вполне оправдана, принимая во внимание угрозу для безопасности, которая может скрываться за автозаполнением; так что теперь его можно отключать при необходимости.

    Datalist Новый элемент datalist позволяет скрестить стандартный input с элементом select . Добавив параметр list , можно затем создать список предустановленных вариантов выбора:

    Ваша родная планета
    Это позволяет пользователям выбрать вариант из списка или добавить свой, если его там нет. Очень удобно для ситуаций, в которых обычно требуется вставлять дополнительное поле «Другое, укажите ниже».

    Удобный гибрид.
    В случае если браузер не поддерживает datalist , такое поле будет функционировать как обычный input .Новые input-ы Параметр type элемента input был значительно расширен в HTML5. Здесь так много натоптанных троп, которые надо замостить, - прямо как строительство сети хайвеев на грибном месте.Поиск Элемент input с значением search в type работает точно так же, как и тот, что со значением text .

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

    Так это, например, делает Safari. Контактные данные Cуществуют три новых значения параметра type для разных типов контактных данных: адресов электронной почты, сайтов и номеров телефонов.

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

    Safari заявляет о поддержке этих новых типов полей, но на первый взгляд, они в нем не выглядят сколько-нибудь отлично от тех, что с type=«text» . Однако если вы испытаете их в Mobile Safari - том, что на мобильных устройствах Apple, - разница станет заметной. Вид экранной клавиатуры будет отличаться для разных полей:

    Новые типы импутов в Mobile Safari.
    Мелочь, а приятно.Ползунки (те, что «слайдеры») Многие JavaScript-библиотеки имеют встроенные разного рода виджеты, которые можно использовать в веб-приложениях. Они работают неплохо; если включен JavaScript, конечно. Но было бы здорово, если б пользователям не приходилось загружать файл скриптов каждый раз, когда мы хотим добавить каких-то особых элементов управления в нашу форму.

    Классический пример - ползунок. До настоящего момент его невозможно было создать без помощи JavaScript. Теперь, с HTML5, он существует как родной браузеровский input с type=«range» .

    Сколько хотите?

    Так выглядит input типа range в Safari и Opera.
    По умолчанию, диапазон этого поля: от нуля до ста. Минимальное и максимальное значения можно задать при помощи параметров min и max соответственно.

    Ваша оценка
    Это все хорошо работает в Safari и Opera - другие браузеры отобразят просто текстовое поле. Это не столь плохо, и мы знаем, что при желании для них всегда можно добавить альтернативную реализацию данного контрола через JavaScript, используя ту проверочную функцию, что я уже приводил выше.

    Естественно, скриптовые решения потребуют больше времени на загрузку и будут менее доступны для дополнительной обработки другими средствами, чем «родные» элементы DOM. Впрочем, по непонятным причинам, тот же range в Safari в данный момент нельзя подружить с клавиатурой… Надеюсь, скоро починят.

    Счетчик Поле с типом range не отображает точное значение, выбранное пользователем, а лишь визуально представляет относительное число на ползунке. Для некоторых случаев это подходит, в других же важна точность - возможность ввести конкретное значение. Для этого есть type=«number» .

    Сколько хотите?
    Браузеры добавляют к такому полю кнопки «плюс-минус», делая его эдаким гибридом между типами text и range .

    Дата и время Один из наиболее популярных JavaScript-виджетов - всплывающий календарь, позволяющий выбрать нужную дату. Как на большинстве сайтов для бронирования авиабилетов, к примеру.

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

    В HTML5 доступна целая горсть разных типов полей для ввода даты и времени:

    date - для года, месяца и числа.
    datetime - год, месяц, число, плюс часы, минуты, секунды и указание часового пояса.
    datetime-local - то же самое, но без указания часового пояса.
    time - часы, минуты, секунды.
    month - год и месяц (без числа).

    Все эти типы запишут отрезок времени в ISO формате YYYY-MM-DDThh:mm:ss.Z, где Y - год, M - месяц, D - число, h - час, m - минута, s - секунда и Z - часовой пояс. В качестве примера - дата и время окончания Первой Мировой войны, 11 часов 11 минут утра, 11-ое Ноября 1918-го года:

    date : 1918-11-11
    datetime : 1918-11-11T11:11:00+01
    datetime-local : 1918-11-11T11:11:00
    time : 11:11:00
    month : 1918-11

    Нет просто типа year , зато есть week - число от 1 до 53 в сочетании с годом.

    Использовать все это довольно просто:

    Start date

    Opera справляется с реализацией возможностей этих новых полей, но выглядят они в ней не сказать что очень привлекательно…
    Как обычно, браузеры, не поддерживающие эту технологию, отобразят простое текстовое поле. В этом случае вы можете либо указать в инструкции для пользователей, в каком формате они должны ввести дату, или же вставить виджет для скриптового календаря. Опять же, не забудьте сначала проверить его встроенную поддержку:

    If (!inputSupportsType("date")) { // Код виджета для календаря. }
    Даже самый красиво написанный календарь такого рода на JavaScript потребует довольно большой объем кода для генерации таблицы дней и обработки событий по их выбору. Встроенная поддержка этой возможности должна работать быстрее и надежнее, не говоря о том, что устранит разнобой в оформлении.

    Пипетка Пожалуй, одним из самых смелых заменителей виджетов, представленных в HTML5, является тип поля color . Он принимает значения в виде цветовых кодов в шестнадцатеричном формате: #000000 для черного, #FFFFFF для белого, и так далее.

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

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

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

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

    Почтовый индекс США
    Большую часть времени параметр pattern вам вряд ли будет нужен. Если же вы решите его задействовать - я вам сочувствую.

    Взгляд в будущее Введение новых видов веб-форм дает HTML5 заметный толчок вперед. Они перекладывают значительную часть бремени, обычно возлагаемого на JavaScript, на плечи HTML5. В данный момент мы еще на переходной стадии - не все из нововведений подерживаются браузерами, и избавиться от JavaScript совсем мы тут пока не можем. Но светлое будущее уже явно не за горами, мы видим первые его лучи и можем в них понежиться.

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

    Я уверен, вы видите все преимущества встроенных в браузеры календарей и ползунков, но вижу в ваших глазах и закономерный вопрос «Можно ли к ним применить CSS-стили?»

    К сожалению, на данный момент ответ скорее - «нет». Над этим работает CSS Working Group.

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

    Но я хочу, чтобы вы задали себе вопрос «А нужно ли к ним применять свои стили?» Ведь многим из нас не нравится, когда горе-разработчики или -дизайнеры навязчиво заставляют нас отказывать от своих привычек и исследовать изобретенные ими интерфейсы, которые, по их мнению, лучше, стандартных (что совсем не всегда факт). Зачем же поощрать эту порочную практику введения пользователей в заблуждение?

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

    Окей, с формами покончено. В следующей части мы примемся за новую, аппетитную семантику HTML5.

    Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье вы узнали о новых структурных элементах в HTML5. В данной статье я бы хотел рассказать, что нового принёс нам HTML5 при работе с формами. В первую очередь это проверка полей на соответствие некоторым условиям, без использования Javascript. Раньше мы все поля для ввода задавали тегом с атрибутом type="text" . Затем javascript’ом проверяли, чтобы поле было непустым, удовлетворяло определенным требованиями (например, e-mail пользователя). С приходом HTML5 вся эта процедура упростилась. Давайте начнём разбираться на примере. Давайте создадим форму и добавим тег с новым атрибутом type="email" (данный атрибут не даст нам отправить форму, пока не будет введен корректный адрес электронной почты):

    Формы в HTML5

    В данном случае мы указали тип поля email , и по сути, пока мы не введем корректный адрес электронной почты, форма не должна отправляться. Яндекс — браузер выводит очень интересную подсказку, когда мы вводим какую-нибудь ерунду в данное поле. Я ввел "123" и попробовал отправить. Вылезло сообщение о том, что необходим символ "@"

    Т.е. если я введу "@" , то форма у нас должна отправится. Что собственно и произошло. Поэтому данным типом поля я не рекомендую пользоваться, если только не добавить в него ещё один атрибут — pattern .

    Данный атрибут проверяет соответствие того, что мы ввели, тому что находится в pattern . Здесь необходимо знание регулярных выражений. Давайте сделаем, чтобы наша форма отправлялась только после того, как мы введем НОРМАЛЬНЫЙ адрес электронной почты, а не только строку, содержащую "@" :

    Электронная почта:

    Если вы не знаете, что такое регулярные выражения, то не беда. В одной из следующих статей они будут рассмотрены.

    Вот теперь у нас поле работает нормально.
    Атрибут required нужен для того, чтобы нельзя было отправить пустое выражение (required — обязателен к заполнению).

    Также появился атрибут type со значением tel , который позволяет ввести телефон:
    Здесь же опять необходимо указывать pattern , чтобы данное поле работало нормально, ведь формат телефонов у всех же разный. К примеру вот такой формат:

    Телефон: Пример корректного номера 937-12-12

    Пока телефон не будет введен правильным способом, форма никуда не отправится. Также отмечу, что pattern можно использовать и в простых текстовых полях (type="text" ).

    Ещё один новый атрибут type со значением url , который позволяет проверить действительно ли введен url. Пример:

    Url:

    . В яндекс-браузере работает корректно.

    Ещё один новый элемент — это ползунок, который задаётся атрибутом type со значением range .

    У данного элемента есть минимальное и максимальное значение, которые затем можно куда-то передавать. Сразу домашнее задание:

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

    Если возникнут трудности, то код можно посмотреть ниже:

    Работа с ползунком в HTML5

    |

    var range = document.getElementById("myrange"); var text = document.getElementById("mytext"); range.addEventListener("change", function(){ //подписываем на событие change text.value = range.value; });

    Следующий новый элемент — это number . Сразу приведу пример и всё станет понятно:

    В данном случае мы можем выбрать элементы от 5 до 100 с шагом 5. Данный элемент далек от совершенства. Мало того, что он в разных браузерах выглядит по-разному, так в него можно вручную внести значение (некоторые браузеры это обрабатывают). Хотя мой браузер вполне нормально обработал данное поле (пользуюсь яндекс-браузером). Использовать его пока не рекомендую, если только не делать проверки на Javascript. Ещё одно домашнее задание (на этот раз кода не будет):

    Сделайте проверку на Javascript, что введенное значение в данное поле должно было кратно 5 (использовать событие change ).

    Пока мы разобрали только один атрибут required . Но есть ещё и другие:

    Атрибут autofocus служит для того, чтобы при переходе на данную страницу, фокус попал именно в данное поле.

    Атрибут placeholder служит для подсказки. Как только вы что-то начнете вводить, подсказка исчезнет. Для примера:

    Электронная почта:

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

    На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.

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

    Обзор нововведений Новые элементы

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

    Элемент Назначение Примечания
    progress Представляет ход выполнения задачи. Элемент progress может представлять состояние загрузки файла.
    meter Представляет значение по шкале в известном диапазоне. Элемент meter можно использовать, например, для измерения температуры или веса.
    datalist Представляет набор элементов option , которые могут использоваться в сочетании с новым атрибутом list для создания раскрывающихся меню. Когда пользователь переходит к вводу данных в области, связанной со списком данных, появляется раскрывающееся меню со значениями из перечня datalist .
    keygen Элемент управления для создания пар ключей. При отправке формы в локальное хранилище заносится закрытый ключ, а на сервер отправляется открытый ключ.
    output Отображает результаты расчета. Примером использования элемента output может служить вывод суммы значений двух введенных элементов.
    Новые типы элементов ввода

    В HTML5 представлено 13 новых элементов ввода. В браузерах, которые их не поддерживают, они превращаются в обычные элементы для ввода текста.

    Тип элемента ввода Назначение Примечания
    tel Ввод номера телефона. Элемент tel не принуждает к вводу текста в определенном формате: для этого можно использовать элемент pattern или метод setCustomValidity() , осуществляющий дополнительную проверку.
    search Предлагает пользователю ввести текст, который необходимо найти. Разница между search и text заключается в основном в оформлении. Для типа search поле ввода можно оформить в соответствии с полями поиска данной платформы.
    url Ввод одного URL. Элемент url используется для ввода отдельного абсолютного URL , который представляет довольно широкий диапазон значений.
    email Ввод одного адреса электронной почты или списка адресов. Если указан атрибут multiple , можно ввести несколько адресов электронной почты через запятую.
    datetime Ввод даты и времени в часовом поясе UTC.
    date Ввод даты без часового пояса.
    month Ввод даты с указанием года и месяца, но без часового пояса.
    week Ввод даты, состоящей из номера недели и года, но без часового пояса. Пример этого формата – 2011-W05 для пятой недели 2011 года.
    time Ввод времени с указанием часов, минут, секунд и долей секунды, но без часового пояса.
    datetime-local Ввод даты и времени без часового пояса.
    number Ввод числовых данных. Допустимые значения – числа с плавающей запятой .
    range Ввод числовых данных (в отличие от типа number само число не играет роли). Реализация этого элемента управления диапазона в большинстве поддерживающих его браузеров – ползунок.
    color Выбор цвета с помощью цветового круга. Значение должно быть действительным простым цветом в нижнем регистре , например #ffffff.
    Новые атрибуты ввода

    В HTML5 также представлено несколько новых атрибутов для элементов ввода и формы.

    Атрибут Назначение Примечания
    autofocus Фокусирование ввода на элементе, когда страница загружена. Атрибут autofocus может применяться к элементам input, select, textarea и button.
    placeholder Подсказка для пользователя о типе данных, которые необходимо ввести. Значение заполнителя отображается светлым текстом, пока элемент не будет выделен и пользователь не введет данные. Этот атрибут можно указывать в элементах input и textarea.
    form Указание одной или нескольких форм, которым принадлежит элемент ввода. С помощью атрибута form элементы ввода можно размещать в любой части страницы, а не только в объекте формы. Кроме того, отдельный элемент можно связать с несколькими формами.
    required Логический атрибут, который означает, что элемент обязателен. Атрибут required полезен при выполнении проверки на основе браузера без использования специального кода JavaScript.
    autocomplete Позволяет указать, что в поле не должно использоваться автозаполнение и в него не следует подставлять значения, ранее введенные пользователем. Атрибут autocomplete полезен для таких полей, как номер кредитной карты или одноразовый пароль, которые не следует заполнять автоматически. По умолчанию атрибут autocomplete имеет состояние on ("вкл."). Чтобы отключить его, установите значение off ("выкл.").
    pattern Проверка значения элемента на основе регулярного выражения. Если используется атрибут pattern , следует также указать значение title , описывающее для пользователя предполагаемый шаблон ввода.
    dirname Предназначен для отправки сведений о направлении элемента управления вместе с формой. Например, если пользователь ввел текст справа налево, а элемент ввода содержит атрибут dirname , то вместе с введенным значением будет отправлен параметр направления.
    novalidate Если в элементе формы указан этот атрибут, проверка ее отправки отключается.
    formaction Переопределение атрибута action в элементе формы.
    formenctype Переопределение атрибута enctype в элементе формы. Этот атрибут поддерживается в элементах input и button .
    formmethod Переопределение атрибута method в элементе формы. Этот атрибут поддерживается в элементах input и button .
    formnovalidate Переопределение атрибута novalidate в элементе формы. Этот атрибут поддерживается в элементах input и button .
    formtarget Переопределение атрибута target в элементе формы. Этот атрибут поддерживается в элементах input и button .
    Объект FormData

    Одно из усовершенствований технологии XMLHttpRequest – появление объекта FormData . С помощью FormData можно создавать и отправлять наборы из пар "ключ/значение" и файлы с применением XMLHttpRequest . При использовании этого метода данные отправляются в том же формате, что и с помощью метода формы submit() с типом кодировки multipart/form-data .

    Объект FormData позволяет оперативно создавать формы HTML на языке JavaScript и отправлять их с помощью метода XMLHttpRequest.send() . Ниже приведен простой пример.

    Var formData = new FormData(); formData.append("part_num", "123ABC"); formData.append("part_price", 7.95); formData.append("part_image", somefile) var xhr = new XMLHttpRequest(); xhr.open("POST", "http://some.url/"); xhr.send(formData);

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

    Var formElement = document.getElementById("someFormElement"); var formData = new FormData(formElement); formData.append("part_description", "The best part ever!"); var xhr = new XMLHttpRequest(); xhr.open("POST", "http://some.url/"); xhr.send(formData);

    Проверка на основе браузера

    Следует признать, что проверка данных формы – довольно скучное занятие, однако избежать его нельзя. Сегодня для проверки допустимости введенных данных и их наличия в обязательных полях формы перед ее отправкой на стороне клиента обычно используется код JavaScript или специальная библиотека.

    Новые атрибуты ввода, такие как required и pattern , в сочетании с селекторами псевдоклассов CSS, облегчают написание проверок и обратную связь с пользователями. Есть и другие усовершенствованные методы проверки, которые позволяют с помощью кода JavaScript задавать специальные правила и сообщения, а также определять недопустимость элемента и ее причины.

    Атрибут required

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

    Атрибут pattern

    Атрибут pattern задает регулярное выражение, используемое для проверки поля ввода. В этом примере показано обязательное поле ввода текста для номера детали. Предполагается, что такой номер состоит из трех букв верхнего регистра и четырех цифр. Использование атрибутов required и pattern позволяет убедиться, что в поле введено значение, которое соответствует этому формату. Если пользователь наводит указатель на поле, отображается сообщение в атрибуте заголовка.

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

    :invalid { border: 2px solid #ff0000; }

    Атрибут formnovalidate

    Атрибут formnovalidate можно применять к элементам input и button . Он включает проверку отправки формы. Ниже приведен пример, в котором для отправки формы с помощью кнопки "Отправить" требуется действительное значение, однако для ее отправки с помощью кнопки "Сохранить" оно не требуется.

    API проверки ограничений

    В API проверки ограничений реализованы удобные инструменты для выполнения особых проверок. Он позволяет решать такие задачи, как установка персонализированной ошибки, проверка допустимости элемента и определение причины его недопустимости. Ниже приведен пример, в котором выдается персонализированное сообщение об ошибке, если значения в двух полях не совпадают.

    Email: Repeat Email Address: function check(input) { if (input.value != document.getElementById("email_addr").value) { input.setCustomValidity("The two email addresses must match."); } else { // input is valid -- reset the error message input.setCustomValidity(""); } }

    Сборка

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

    Логический атрибут required HTML сообщает браузеру о возможности отправки данных формы только при заполнении обязательных полей. Это значит, что поле нельзя оставить пустым, и что в зависимости от других атрибутов или типов полей приниматься могут только конкретные типы значений. Чуть позже мы поговорим о том, как сообщать браузерам о необходимости отправки определенные типы данных.

    Если обязательные поля остаются пустыми, форма не будет отправлена. Opera , Firefox , Internet Explorer 10+ и Chrome выдают пользователю сообщение об ошибке. Например, «Заполните это поле » или «Нужно заполнить пустые поля ».

    В терминологии Javascript событие focus запускает элемент формы, когда на нее переключается фокус, когда фокус переходит на другой элемент или она теряет фокус.

    В CSS можно использовать псевдокласс :focus для стилизации элементов, которые выделены в данный момент.

    Атрибут required применим для любого типа элемента ввода, за исключением button , submit , image , color и hidden . У всех этих элементов имеется значение по умолчанию, поэтому дополнительный атрибут будет лишним. Синтаксис данного атрибута просто required или required=»required» , если вы используете XHTML-синтаксис .

    Добавим атрибут HTML input required к форме регистрации. Сделаем поля имени, адреса электронной почты, пароля и даты подписки обязательными:

    • Моё имя:
    • Мой email:
    • Мой вебсайт:
    • Мой будущий пароль:

      (как минимум 6 символов, без пробелов)

    • Мои знания HTML от 1 до 10:
    • Хочу, чтобы моя подписка начиналась с:
    • Я бы хотел получать копии книг The HTML5 Herald
    • Также хочу подписаться на The CSS3 Chronicle

    На скриншотах, приведенных ниже, можно видеть, что делает атрибут required HTML при попытке подтвердить форму:

    Сообщение об обязательных полях в Firefox


    Та же ситуация в Opera…


    и в Google Chrome

    Стилизация обязательных полей в форме

    Вы можете стилизовать обязательные поля в формах при помощи псевдокласса :required,:optional или отрицательного псевдокласса :not(:required)) . Также можно стилизовать валидные и не валидные поля с помощью псевдоклассов :valid и :invalid . При помощи этих псевдоклассов HTML input required можно показывать пользователям, какие поля обязательны к заполнению:

    input { background-position: 0% 50%; background-repeat: no-repeat; padding-left: 15px; } input:required { background-image: url("../images/required.png"); } input:focus:invalid { background-image: url("../images/invalid.png"); } input:focus:valid { background-image: url("../images/valid.png"); }

    В данном случае мы добавляем фоновое изображение (звёздочку ) к обязательным полям формы. В input-элементы нельзя включать генерируемый контент. Поэтому лучше будет использовать фоновое изображение. Кроме этого валидные и не валидные поля можно выделить разными фоновыми картинками. Изменения будут заметны, только если пользователь выделил соответствующий элемент формы.

    Предупреждение : Firefox стилизует не валидные элементы

    Учтите, что браузер Firefox применяет к не валидным элементам собственную стилизацию (красную тень ), как было показано на одной из картинок выше. Чтобы отключить этот эффект для required HTML , воспользуйтесь следующим CSS-кодом :

    :invalid { box-shadow: none; }

    Подсказка : таргетированная стилизация для устаревших браузеров



    Понравилась статья? Поделиться с друзьями: