Новые элементы форм HTML5

70

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

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

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

Подсказки ввода <datalist>

Элемент <datalist> предоставляет способ присоединить выпадающий список возможных вариантов ввода к обыкновенному текстовому полю. Заполняющим форму пользователям он дает возможность либо выбрать вариант ввода из списка значений, либо ввести требуемое значение вручную:

Элемент datalist

Чтобы использовать элемент datalist, сначала нужно создать обычное текстовое поле. Допустим, мы создали обычный элемент <input>:

<fieldset>
     <legend>Выберите любимый фрукт</legend>
     <label for="fruit">Фрукт</label>
     <input id="fruit">
</fieldset>

Чтобы добавить к этому полю выпадающий список возможных значений, для него нужно создать элемент <datalist>. Технически этот элемент можно разместить в любом месте разметки, т.к. он не отображается браузером, а просто предоставляет данные для использования в текстовом поле ввода. Но логично поместить этот элемент либо непосредственно перед тем элементом <input>, для которого он предоставляет свои данные, либо сразу же после него. Далее показан пример кода для создания списка <datalist>:

<datalist id="dl_fruits">
        <option label="Яблоко" value="apple">
        <option label="Ананас" value="ananas">
        <option label="Абрикос" value="apricot">
        <option label="Арбуз" value="watermelon">
        <option label="Авокадо" value="avocado">
        <option label="Апельсин" value="Orange">
</datalist>

Как и традиционное поле <select>, список <datalist> использует элементы <option>. Каждый элемент <option> представляет собой отдельное возможное значение, которое браузер может предложить заполняющему форму. Значение атрибута label содержит текст, который отображается в текстовом поле, а атрибут value — текст, который будет отправлен на сервер, если пользователь выберет данную опцию.

Сам по себе список <datalist> не отображается в браузере. Для того чтобы подключить его к текстовому полю, нужно установить значение атрибута list равным значению параметра id соответствующего списка <datalist>:

<input id="fruit" list="dl_fruits">

В браузерах, которые поддерживают <datalist> (а в настоящее время это только Opera 10 и Firefox 4 или более поздние версии), посетители увидят результат, как на рисунке выше. Другие браузеры будут игнорировать атрибут list и разметку <datalist>, делая все предложения возможного ввода бесполезными.

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

В следующем листинге приводится разметка, в которой используется это поведение:

<fieldset>
     <legend>Выберите любимый фрукт</legend>
     <datalist id="dl_fruits">
        <span class="Label">Выберите из списка:</span>
        <select id="favoriteFruite">
           <option label="Яблоко" value="apple">
           <option label="Ананас" value="ananas">
           <option label="Абрикос" value="apricot">
           <option label="Арбуз" value="watermelon">
           <option label="Авокадо" value="avocado">
           <option label="Апельсин" value="Orange">
        </select>
        <br>
        <span class="Label">Или введите вручную:</span>
     </datalist>
     
     <input id="fruit" list="dl_fruits">
</fieldset>
.Label {
   display: inline-block;
   width: 125px;
}

Браузеры, которые распознают элемент <datalist>, будут отображать только одно текстовое поле и выпадающий список предлагаемых вариантов ввода. Но для других браузеров этот дополнительный код облекает предлагаемые варианты ввода в традиционный список <select>, предоставляя пользователю возможность ввести собственное значение или же выбрать готовое значение из списка:

Возможные варианты ввода можно предлагать и в браузерах, которые не поддерживают элемент <datalist>, обернув их сначала в список <select>

Но этот подход не работает незаметно. При получении данных формы на сервере необходимо проверить на наличие данных из списка <select> (favoriteFruite) и из списка <datalist> (dl_fruits). За исключением этого незначительного недостатка, это надежный способ предоставить новое удобство всем пользователям без исключения.

Индикатор выполнения <progress> и счетчик <meter>

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

Элемент <meter> указывает значение в диапазоне известных значений. Внешне похож на элемент <progress>, но зеленая полоска имеет другой оттенок и не пульсирует. В зависимости от браузера цвет индикаторной полоски элемента <meter> может меняться при отображении значения, определенного как "слишком низкое" или "слишком высокое". Например, в браузере Chrome при отображении последнего значения цвет индикатора меняется с зеленого на желтый. Но самая важная разница между элементами <progress> и <meter> заключается в их семантическом значении.

Progress и счетчик meter

Для помещения в форму элементов <meter> и <progress> нет надобности. Более того, они даже не являются настоящими элементами управления формы, т.к. не собирают информацию от посетителя веб-страницы. Но официальный стандарт HTML5 включает их потому, что в некоторых отношениях они чувствуются как элементы формы, возможно, из-за графического отображения данных.

В настоящее время элементы <progress> и <meter> поддерживаются браузерам Chrome 9, Opera 11, Firefox 5 и Safari 5.1 (а также их более поздними версиями).

Применение элементов <progress> и <meter> не составляет никакого труда. Сначала рассмотрим элемент <progress>. Он использует атрибут value, который обозначает ход выполнения задания в виде дробной величины от 0 до 1. Графически это отображается соответствующей шириной полоски индикатора. Например, чтобы показать, что задание выполнено на 25%, атрибуту value присваивается значение 0,25:

<progress value=0.25></progress>

Альтернативно, можно использовать атрибут max, чтобы установить максимальное значение и изменить масштаб индикатора. Например, при значении max, равном 200, значение value должно быть между 0 и 200. Если сделать значение value равным 50, то получим те же самые 25% заполнения индикатора, как и в предыдущем примере:

<progress value="50" max="200"></progress>

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

<progress value="50" max="200"> 25% </progress>

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

Для индикатора выполнения есть еще одна опция в виде неопределенного состояния индикатора, которое указывает, что задание выполняется, но точное время его завершения неизвестно. (Индикатор в неопределенном состоянии можно рассматривать как вычурное сообщение "Задание в процессе выполнения".) Визуально индикатор в неопределенном состоянии выглядит как серое поле, вдоль которого периодически слева направо пробегает зеленая размытая полоска. Чтобы создать этот индикатор, просто не употребляйте атрибут value:

<progress>Расчет выполняется...</progress>

Элемент <meter> имеет подобную модель, но отображает любой вид измерений. Иногда его еще называют шкалой. Часто значение атрибута value этого элемента отображает какую-то действительную величину, например денежную сумму на счету, количество дней, вес в килограммах и т.п. Отображение этой информации управляется установкой значений атрибутов min и max:

<meter min="5" max="70" value="28">28 килограм</meter>

Как и для элемента <progress>, содержимое внутри элемента <meter> отображается только в браузерах, которые не поддерживают его. Но иногда значение элемента <meter> нужно вывести в числовом формате. В таком случае его нужно задать на странице обычной разметкой; при этом резервное значение внутри элемента не требуется. Этот подход демонстрируется в следующем примере. Вся информация выводится на страницу обычной разметкой, а элемент <meter> додается в качестве необязательного визуального ориентира:

<p>Нашей целью является собрать 50,000 руб.</p>
<p>Всего мы собрали 14,000 руб. <meter max="50000" value="14000"></meter></p>

Элемент <meter> также достаточно интеллектуальный, чтобы указывать значения выше или ниже допустимых и в то же самое время отображать их должным образом. Для этого в нем используются атрибуты low и high.

Например, значение value, превышающее значение high, но меньше значения max, будет выше какого-то требуемого значения, но все еще в пределах допустимого максимального значения. Подобным образом значение value ниже значения low, но выше значения min, не удовлетворяет какому-либо требованию низкого значения, но будет все еще в пределах допустимого минимального значения:

Ваш багаж весит: <meter min="5" max="70" value="28">28 килограм</meter><br>
Ваш багаж весит: <meter min="5" max="100" high="70" value="79">79 килограм</meter>*
<p><small>* За багаж весом больше 70 кг. нужно доплатить.</small></p>

Браузеры могут использовать или не использовать информацию атрибутов low и high. Например, браузер Chrome отображает слишком высокие значения (как в предыдущем примере) желтым цветом, но значения ниже low показывает как обычные. Наконец, атрибут optimum служит для указания определенного оптимального значения, но использование этого атрибута не влияет на отображение этого значения в современных браузерах.

В общем, элементы <progress> и <meter> предоставляют незначительные удобства, которые будут полезными, когда уровень их поддержки браузерами будет немного выше.

Элементы <command> и <menu> для создания кнопок команд и меню

Эти две возможности можно считать самыми замечательными, но пока не реализованными. Идея заключается в том, чтобы использовать один элемент для представления действия, которое пользователь может активировать (т.е., <command>), a другой элемент для группирования нескольких таких элементов (т.е. <menu>).

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

Пройди тесты
Лучший чат для C# программистов