Формы – замечательная возможность HTML, позволяющая с привлечением довольно небольшого количества усилий разработчика организовать взаимодействие с пользователями программ, работающих на удаленных серверах Сети.
Возможно, вам не раз приходилось заполнять анкеты на сайтах, например при регистрации ящика электронной почты. Если приходилось, то вспомните, что данные вы вводили прямо в окне браузера. После ввода данных нажимали кнопку типа Отправить. Далее браузер упаковывал и отсылал введенные вами данные на сервер, где их обрабатывало специализированное приложение (CGI‑приложение). Так вот, формы нужны как раз для того, чтобы можно было организовать ввод данных от пользователя. HTML‑документы с формами отличаются от обычных документов только наличием различных элементов управления: полей ввода текста, флажков, кнопок и др. (см. любое окно Windows или рис. 9.1).
Рис. 9.1. Пример HTML-документа с формой
Выше было сказано, что данные, введенные пользователем в форму, обрабатываются CGI‑приложениями, работающими на сервере. Подробное рассмотрение этих приложений выходит за рамки книги. Здесь же стоит сказать, что CGI‑приложение – это обычное приложение (программа), запущенное на сервере и способное получать данные, отправленные с использованием CGI (Common Gateway Interface). Отсюда, собственно, и название этого класса приложений. Вообще, такое приложение может быть реализовано как угодно: на Java, сценарием PHP, JSP или ASP и т. д. Общее, что такие приложения выполняют, – прием запроса (набора значений полей формы) с некоторой служебной информацией и передача в ответ HTML‑документа, являющегося результатом обработки принятого запроса.
Данные, введенные в форму, в некоторых случаях могут обрабатываться и на стороне клиента с помощью сценариев. Однако сценарии будут рассмотрены позже. Далее же в этой главе описываются создание и настройка форм, данные которых предназначены для отправки CGI‑приложению.
9.1. Создание формы
Для вставки формы в HTML‑документ используется элемент FORM. Он задается парными тегами
. Между этими тегами помещаются описания элементов управления формы. Здесь также может быть помещен Рё РґСЂСѓРіРѕР№ текст СЃ использованием разметки средствами HTML. Ртот текст обычно используется для пояснения, какие данные Рё РІ какой элемент управления нужно вводить. РџСЂРё создании формы используются следующие атрибуты элемента FORM:• action – обязательный для каждой формы параметр, URI программы‑обработчика данных формы;
• method – задает способ отправки данных, введенных в форму, может принимать значения get (используется по умолчанию) или post;
• enctype – задает тип данных формы, если используется метод отправки post; по умолчанию имеет значение application/x-www-form-urlencoded; при необходимости передачи файлов используется значение multipart/form-data;
• accept-charset – используется при передаче файлов, позволяет указать, какие кодировки используются для каждого из файлов (список строковых значений – названий кодировок), по умолчанию используется значение UNKNOWN (приложение на сервере должно само определять кодировки);
• accept – описывает типы файлов (MIME‑типы), передаваемые серверу; если этот параметр не использовать, то серверное приложение должно уметь само определять типы передаваемых ему файлов.
Пример описания формы:
<FORM action = В«somesite.com/cgi-bin/proc.exeВ» method = В«postВ»>
<!– Описания элементов управления и текста формы –>
...
</FORM>
Перед тем как приступить Рє рассмотрению элементов управления, которые можно поместить РЅР° форму, приведу несколько слов Рѕ методах отправки данных форм: для чего РѕРЅРё нужны Рё чем отличаются. Ртак, метод get часто используется для отправки небольших объемов данных, для которых достаточно набора символов РєРѕРґРёСЂРѕРІРєРё ASCII. РџСЂРё этом данные формы присоединяются Рє строке URI, заданной РІ action формы. Для отделения данных РѕС‚ URI используется СЃРёРјРІРѕР» ?. Точно таким же образом РІС‹ передавали данные почтовой программе РїСЂРё рассмотрении гиперссылок РІ РіР». 5.
В отличие от get, метод post позволяет передавать CGI‑приложению практически любые данные. При использовании метода post браузер отправляет приложению не строку URI с присоединенными данными, а по специальным правилам упаковывает данные формы и только после этого отправляет их CGI‑приложению. Однако для того, чтобы с использованием метода post можно было пересылать бинарные или текстовые данные, для которых недостаточно символов кодировки ASCII, нужно указывать значения атрибута enctype элемента FORM равным multipart/form-data.
9.2. Рлементы управления формы
Ранее были рассмотрены вопросы по созданию и настройке форм. Однако данные в формах пользователь вводит с помощью элементов управления. Теперь самое время перейти к рассмотрению того, какие элементы управления можно помещать на форму и как эти элементы управления выглядят и функционируют.
Стандартные элементы управления
Стандартными являются все элементы управления, которые можно поместить на HTML‑форму. Просто нужно как‑то объединить и назвать элементы управления, которые используются чаще всего: однострочное текстовое поле, поле для ввода пароля, флажки, переключатели, кнопки (как пользовательские, так и выполняющие стандартные действия), поля имен файлов. Все упомянутые элементы управления отображаются браузером Internet Explorer так, как показано на рис. 9.2.
Рис. 9.2. Стандартные элементы управления
Для обозначения всех этих элементов управления используется РѕРґРёРЅ HTML‑элемент – INPUT. Рлемент задается одиночным тегом и имеет следующие атрибуты:
• type – принимает строку, задающую тип элемента управления (по умолчанию используется строка text, и создается, соответственно, поле для ввода текста), возможные значения и специфика работы соответствующих элементов управления рассмотрены далее;
• name – используется для задания имени элементу управления (строка, которая, помимо идентификации элемента управления, добавляется в данные, отсылаемые серверу);
• value – начальное значение для полей ввода текста и полей для указания имен файлов, также используется как надпись таких элементов управления, как кнопки; необязательно для всех элементов управления, кроме флажков и переключателей;
• checked – булев атрибут, если он установлен, то флажок или переключатель считается (и отображается браузером) установленным (см. рис. 9.1);
• disabled – булев атрибут, установка которого не позволяет пользователю работать с элементом управления;
• readonly – булев атрибут, позволяет запретить изменение состояния элемента управления (работает только для текстовых полей и поля выбора файла, так что для остальных элементов управления лучше использовать атрибут disabled, однако при этом данные деактивированных элементов управления не отправляются серверу);
• size – задает размер элемента управления (единицы измерения и действие специфичны для разных элементов управления);
• maxlenth – задает максимальную длину текста, который может быть введен в текстовые поля (положительное численное значение);
• src – для элемента управления image задает расположение используемого изображения;
• title – описание элемента управления (может отображаться браузерами как всплывающая подсказка);
• align – задает горизонтальное выравнивание элемента управления, работает так же, как и для любого другого HTML‑элемента, поддерживающего этот атрибут;
• tabindex – номер элемента управления при навигации при помощи табуляции;
• accesskey – горячая клавиша для элемента управления (для перехода к элементу управления нужно нажать Alt и заданную клавишу).
После того как дано начальное описание элемента INPUT, можно проанализировать текст HTML‑документа с формой, показанной на рис. 9.2 (пример 9.1).
Пример 9.1. Пример использования HTML-элемента INPUT
<TITLE>Типы элементов управления INPUT</TITLE>
<FORM action="..." method="post" enctype = "multipart/form-data">
Текстовое поле <INPUT type="text" name="type_text"><BR>
Поле для ввода пароля: <INPUT type="password" name="type_password"
alt = "asfdsvdf"><BR>
Флажок: <INPUT type="checkbox" name="type_check" value = "chk1"
checked><BR>
Два переключателя: <INPUT type="radio" name="type_radio" value="1"
checked>
Рё <INPUT type="radio" name="type_radio" value="2"><BR>
Поле с именами файлов: <INPUT type = "file" name = "type_file"><BR>
<INPUT type = "submit" value = "Отправка данных"><BR>
Щелчок на этом изображении также приведет к отправке данных:
<INPUT type = "image" src = "submit.gif""><BR>
<INPUT type = "reset" value = "Сброс значений полей"><BR>
<INPUT type = "button" value = "Пользовательская кнопка">
</FORM>
В приведенном примере использованы все возможные значения атрибута type, кроме значения hidden. Поскольку использование каждого из значений атрибута type налагает различные ограничения на использование других атрибутов HTML‑элемента INPUT, то целесообразно рассмотреть влияние каждого значения подробно. Для краткости особенности использования каждого значения сведены в таблицу (табл. 9.1).
Таблица 9.1. Значения атрибута type
Атрибут size упоминался только для элементов управления, имеющих РІ своем составе текстовые поля. Рто потому, что хотя для остальных элементов управления этот атрибут Рё должен принимать значения РІ пикселах Рё задавать соответствующую ширину этих элементов управления, РЅРѕ трудно найти браузер, который Р±С‹ это поддерживал.
Многострочное текстовое поле
Теперь рассмотрим, как вставить РІ форму более продвинутый элемент управления для редактирования текста – многострочное текстовое поле. Ртот элемент управления обозначается HTML‑элементом TEXTAREA Рё задается парными тегами .
Главным отличием этого элемента управления от обычного текстового поля, кроме возможности ввода текста, состоящего из большого количества строк, является то, что начальное значение не задается атрибутом value, а записывается между тегами .
При отображении в текстовом поле форматирование текста сохраняется точно так же, как при использовании HTML‑элемента PRE.
В целом для настройки элемента TEXTAREA используются те же атрибуты, что и для настройки элемента INPUT со значением атрибута type, равным text или password. Однако размер элемента управления задается не атрибутом size, а с помощью следующих атрибутов:
• rows – задает количество строк, которые отображаются без необходимости вертикальной прокрутки;
• cols – задает максимальное количество символов в строке текстового поля, отображаемое без переноса.
Многострочное текстовое поле выглядит так, как показано на рис. 9.3 (в браузере Internet Explorer).
Рис. 9.3. Многострочное текстовое поле
Для создания приведенного на рисунке текстового поля использовался следующий фрагмент кода (пример 9.2).
Пример 9.2. Создание многострочного текстового поля
<TEXTAREA name = В«txtTextВ» rows = 10 cols = 40>
Первый перевод строки не учитывается
Все последующие переводы строки учитываются
Учитываются также отступы от начала строки
Можно использовать зарезервированные символы HTML, типа <>& и прочие
</TEXTAREA>
РЎРЅРѕРІР° РєРЅРѕРїРєРё
В HTML предусмотрен отдельный элемент BUTTON на случай, если разработчику формы не хватит возможностей обычных командных кнопок. При помощи этого HTML‑элемента создаются кнопки, на которые можно поместить практически все, за исключением разве что других форм, фреймов и некоторых других особых HTML‑элементов. Такая кнопка выглядит в браузере Internet Explorer так, как показано на рис. 9.4.
Рис. 9.4. Кнопка с расширенными возможностями
Новый вид кнопок используется аналогично кнопкам, создаваемым HTML‑элементом INPUT со значением атрибута type, равным button. Новые кнопки отличаются от своего аналога, прежде всего, созданием: для задания HTML‑элемента BUTTON используются парные теги , между которыми помещается форматированный текст. Так, за создание кнопки, показанной на рис. 9.4, отвечает следующий HTML‑код (пример 9.3).
Пример 9.3. Создание кнопки BUTTON
<BUTTON name = В«cmbSomeButttonВ» type = В«buttonВ»>
<BR>
На этом виде кнопок может быть помещен любой<BR>
HTML-текст c использованием <STRONG>разметки</STRONG><BR>
Даже таблицы, не говоря уже об изображениях:
<TABLE border = 1>
<CAPTION>Таблица</CAPTION>
<TR><TD>1<TD>2
<TR><TD>3<TD>4
</TABLE>
<BR>
</BUTTON>
Внимание!
В тексте между тегами <BUTTON> и </BUTTON> правильного HTML-документа не должны задаваться другие HTML-элементы, обладающие возможностями гиперссылок. В лучшем случае, если браузер это предусматривает, то такие HTML-элементы будут просто игнорироваться. В худшем же случае, если браузер не переносит HTML-документ с ошибками, то его поведение вообще сложно предугадать.
Специфичным в настройке кнопки, создаваемой HTML‑элементом BUTTON, является использование атрибута type для задания типа кнопки: submit (отправка формы при нажатии), reset (сброс значений элементов управления формы при нажатии) или button (пользовательская кнопка, связываемая со сценарием). Кроме того, доступны атрибуты name, title, disabled, tabindex и accesskey, использование которых полностью аналогично использованию атрибутов элемента INPUT.
Следует особо рассмотреть атрибут value. Его использование только для подписи кнопки становится бессмысленным. Однако в спецификации HTML 4.01 говорится, что предполагается отправка значения этого атрибута вместе с прочими данными формы (видимо при нажатии соответствующей кнопки, имеющей значение атрибута type, равное submit, тогда задание значения атрибута value является весьма полезным для определения на сервере того, какую именно кнопку нажал пользователь).
Меню
РџСЂРё создании форм можно использовать еще РѕРґРёРЅ достаточно удобный элемент управления, позволяющий выбрать РѕРґРЅСѓ или несколько альтернатив РёР· СЃРїРёСЃРєР° – меню (или СЃРїРёСЃРѕРє параметров). Ртот элемент управления добавляется РЅР° форму использованием трех HTML‑элементов: SELECT, OPTGROUP Рё OPTION. Хотя обязательно использовать только первый Рё последний РёР· РЅРёС….
Начнем с HTML‑элемента SELECT – он является контейнером пунктов меню, задается при помощи парных тегов и поддерживает следующие атрибуты:
• name – имя меню, которое также используется как название параметра при отправке формы;
• size – задает количество строк, одновременно видимых пользователем;
• multiple – булев атрибут, позволяет разрешить выделение нескольких пунктов меню одновременно;
• disabled – булев атрибут, деактивирует меню;
• title – текст подсказки для меню;
• tabindex – номер при перемещении между элементами управления при помощи табуляции.
Рлемент управления меню может представляться различными браузерами по‑разному: РІ РІРёРґРµ СЃРїРёСЃРєР°, РІ РІРёРґРµ раскрывающегося СЃРїРёСЃРєР°, РІ РІРёРґРµ раскрывающегося меню, наконец. Рассмотрим представление меню браузером Internet Explorer. Р’ зависимости РѕС‚ значения атрибута size меню может выглядеть так, как показано РЅР° СЂРёСЃ. 9.5.
Рис. 9.5. Внешний вид меню
Если использовать атрибут multiple, то Internet Explorer покажет меню простым списком даже при значении size равном 1: в раскрывающемся списке несколько пунктов сразу выбрать нельзя.
Ниже приведен фрагмент текста HTML‑документа, создающий два меню, показанных на рис. 9.5 (согласитесь, что задание меню сходно с заданием списков) (пример 9.4).
Пример 9.4. Два простых меню
size = 1
<SELECT name = "menu1">
<OPTION value = "1.2">РџСѓРЅРєС‚ 1
<OPTION value = "1.2">РџСѓРЅРєС‚ 2
<OPTION value = "1.3">РџСѓРЅРєС‚ 3
<OPTION value = "1.4">РџСѓРЅРєС‚ 4
<OPTION value = "1.5">РџСѓРЅРєС‚ 5
<OPTION value = "1.6">РџСѓРЅРєС‚ 6
</SELECT>
size = 4
<SELECT name = "menu2" size = "4">
<OPTION value = "2.1">РџСѓРЅРєС‚ 1
<OPTION value = "2.2">РџСѓРЅРєС‚ 2
<OPTION value = "2.3">РџСѓРЅРєС‚ 3
<OPTION value = "2.4">РџСѓРЅРєС‚ 4
<OPTION value = "2.5">РџСѓРЅРєС‚ 5
<OPTION value = "2.6">РџСѓРЅРєС‚ 6
</SELECT>
Р’ тексте примера РІС‹ видите также упомянутый ранее HTML‑элемент OPTION. Ртак, этот элемент используется для задания отдельных пунктов меню. РћРЅ задается парными тегами (закрывающий тег необязателен), между которыми помещается текст пункта меню. Рмеет следующие атрибуты:
• value – текст, который будет отправлен с формой при выборе пункта меню;
• selected – булев атрибут, позволяет выделить пункт меню по умолчанию (не следует устанавливать для нескольких пунктов одно меню, если не установлен атрибут multiple);
• disabled – булев атрибут, запрещает выбор пункта меню (правда, в реализации меню списками, как в Internet Explorer, это сделать довольно сложно, поэтому разработчики браузера особенно не мучились и не реализовали этот атрибут).
Теперь осталось рассмотреть, для чего нужен третий HTML‑элемент – OPTGROUP. Так вот, элемент OPTGROUP используется для группировки пунктов меню. Группы создаются заключением HTML‑элементов OPTION, определяющих пункты меню одной группы, в парные теги . Параметры группы можно настроить с использованием следующих атрибутов HTML‑элемента OPTGROUP:
• label – строка с подписью для группы;
• disabled – запретить выбор пунктов меню, принадлежащих этой группе (аналогично атрибуту disabled для элемента OPTION).
Ниже приведен пример разбиения пунктов меню на группы для двух меню (пример 9.5).
Пример 9.5. Группировка пунктов меню
size = 1
<SELECT name = "menu1">
<OPTGROUP label = "Группа1">
<OPTION value = "1.1.1">РџСѓРЅРєС‚ 1.1
<OPTION value = "1.1.2">РџСѓРЅРєС‚ 1.2
<OPTION value = "1.1.3">РџСѓРЅРєС‚ 1.3
</OPTGROUP>
<OPTGROUP label = "Группа2">
<OPTION value = "1.2.1">РџСѓРЅРєС‚ 2.1
<OPTION value = "1.2.2">РџСѓРЅРєС‚ 2.2
<OPTION value = "1.2.3">РџСѓРЅРєС‚ 2.3
</OPTGROUP>
</SELECT>
size = 4
<SELECT name = "menu2" size = "4">
<OPTGROUP label = "Группа1">
<OPTION value = "2.1.1">РџСѓРЅРєС‚ 1.1
<OPTION value = "2.1.2">РџСѓРЅРєС‚ 1.2
<OPTION value = "2.1.3">РџСѓРЅРєС‚ 1.3
</OPTGROUP>
<OPTGROUP label = "Группа2">
<OPTION value = "2.2.1">РџСѓРЅРєС‚ 2.1
<OPTION value = "2.2.2">РџСѓРЅРєС‚ 2.2
<OPTION value = "2.2.3">РџСѓРЅРєС‚ 2.3
</OPTGROUP>
</SELECT>
Меню, описанные в примере 9.5, выглядят так, как показано на рис. 9.6.
Рис. 9.6. Внешний вид меню с группированными пунктами
Подписи элементов управления
Некоторые элементы управления, например кнопки, содержат надписи, по которым пользователь может определить назначение этих элементов управления. Для других элементов типа текстовых полей, флажков и т. п. приходится создавать подписи вручную, смешивая определения элементов управления формы с текстом.
Существует еще один способ задания подписей к элементам управления – использование HTML‑элемента LABEL. Задание подписей таким образом осуществляется ничуть не легче, а даже тяжелей, однако добавляет возможностей по автоматической обработке HTML‑документа.
Ртак, рассмотрим, каким образом создаются РїРѕРґРїРёСЃРё СЃ использованием элемента LABEL: между парными тегами помещается текст РїРѕРґРїРёСЃРё, Р° атрибуту for элемента LABEL присваивается значение, идентифицирующее нужный элемент управления.
РџСЂРё задании значения атрибута for следует помнить, что нужно использовать значение атрибута id нужного элемента управления. Рто значит, что элементам управления нужно дополнительно задавать значения атрибута id. Пример создания РїРѕРґРїРёСЃРё таким образом:
<LABEL for = «pass»>Введите пароль:</LABEL>
<INPUT type = "password" name = "user_pass" id = "pass">
В рассмотренном примере элемент LABEL явно ассоциируется с полем ввода пароля. Существует еще способ, при котором можно ассоциировать подпись с элементом управления неявно (без задания значения атрибута for элемента LABEL). Для этого нужно поместить элемент управления в теле элемента LABEL. Предыдущий пример при этом может выглядеть так:
<LABEL>
Введите пароль: <INPUT type = "password" name = "user_pass">
</LABEL>
Текст может находиться до или после определения элемента управления. В теле HTML‑элемента LABEL в этом случае должно быть только одно определение элемента управления.
9.3. Группировка элементов управления
При создании форм есть возможность сделать более выразительным общее предназначение некоторых элементов управления, дополнительно заключив их в рамку так, как показано на рис. 9.1. Рамку можно подписать, а можно оставить без подписи.
Рамка создается при помощи HTML‑элемента FIELDSET. Между парными тегами
помещаются определения элементов управления, принадлежащих РіСЂСѓРїРїРµ. Р’РѕРєСЂСѓРі этих элементов управления Рё будет нарисована рамка.Для создания РїРѕРґРїРёСЃРё Рє рамке нужно внутри элемента FIELDSET определить элемент LEGEND. Ртот HTML‑элемент задается РїСЂРё помощи парных тегов , между которыми помещается текст РїРѕРґРїРёСЃРё. Можно «поиграть» также СЃ выравниванием РїРѕРґРїРёСЃРё РїСЂРё помощи атрибута align, однако следует знать, что разные браузеры по‑разному реализуют значения этого атрибута, Р° некоторые значения Рё совсем РЅРµ поддерживают.
В заключение рассмотрим, как реализована группировка элементов управления формы, показанной на рис. 9.1 (пример 9.6).
Пример 9.6. Группировка элементов управления
<HTML>
<HEAD>
<TITLE>Пример страницы с формой</TITLE>
</HEAD>
<BODY>
<FORM action="somesite.com/cgi-bin/proc.exe">
<H1>Регистрация почтового ящика</H1>
<P>
<FIELDSET>
<LEGEND>Персональная информация</LEGEND>
Фамилия: <INPUT name="personal_lastname" type="text" tabindex="1"><BR>
РРјСЏ: <INPUT name="personal_firstname" type="text" tabindex="2"><BR>
</FIELDSET>
<FIELDSET>
<LEGEND>Рнформация Рѕ почтовом ящике</LEGEND>
Адрес: <INPUT name="mail_address" tabindex="3"> <BR>
Пароль: <INPUT name="mail_password" type = "password" tabindex="4">
<BR>
Подтверждение пароля: <INPUT name="mail_password" type = "password"
tabindex="5">
</FIELDSET>
<FIELDSET>
<LEGEND>Дополнительные сведения</LEGEND>
Желаете получать рекламные рассылки?
<INPUT name="add_goods" type="radio" value="Yes" tabindex="6">Да
<INPUT name="add_goods" type="radio" checked value="No"
tabindex="7">Нет
<BR>
Желаете получать прогноз погоды на каждый день?
<INPUT name="add_weather" type="radio" value="Yes" tabindex="8">Да
<INPUT name="add_weather" type="radio" checked value="No"
tabindex="9">Нет
</FIELDSET>
<P>
<INPUT type = "submit" value = "Регистрация" tabindex = "10">
<INPUT type = "reset" value = "РЎР±СЂРѕСЃ" tabindex = "11">
</FORM>
</BODY>
</HTML>
Ртот пример является практически законченной страницей СЃ формой: жаль, что РїРѕ адресу somesite.com/cgi-bin/proc.exe нет реального CGI‑приложения, СЃРїРѕСЃРѕР±РЅРѕРіРѕ обрабатывать форму.