Кратко
СкопированоТег <form>
добавляет на страницу форму, которую пользователь может заполнить. Например, ввести своё имя, фамилию или почту. Данные формы отправляются на сервер.
Пример
Скопировано<form action="" method="get"> <p> <label for="name">Введите имя:</label> <input type="text" name="name" id="name" required> </p> <p> <label for="email">Введите email:</label> <input type="email" name="email" id="email" required> </p> <button type="submit">Отправить</button></form>
<form action="" method="get"> <p> <label for="name">Введите имя:</label> <input type="text" name="name" id="name" required> </p> <p> <label for="email">Введите email:</label> <input type="email" name="email" id="email" required> </p> <button type="submit">Отправить</button> </form>
Как понять
СкопированоСайты используют формы, чтобы получить какую-то информацию от пользователя. Это может быть форма заказа в онлайн-магазине или форма обратной связи. Пользователь заполняет поля или выбирает нужную опцию в списке, а после отправки формы эти данные можно обработать.
Как пишется
СкопированоСтилизовать <form>
можно с помощью CSS.
На странице можно сделать сколько угодно форм. Но одновременно пользователь сможет отправить только одну заполненную форму.
Атрибуты
Скопированоaction
— здесь указывается ссылка на скрипт, который обработает форму. Это может быть полная URL-ссылка, а может быть относительная, типа html
. Если не указать атрибут action
, то страница будет просто обновляться каждый раз, когда отправляется форма.
method
— может определять, каким способом будут отправлены на сервер данные, которые ввёл пользователь. Есть два варианта:
get
— ответы пользователя дописываются в URL в формате «параметр=значение», например «email=name@yandex.ru». Выглядит это так:site
. То есть параметр — это то, что вы спрашиваете у пользователя, а значение — его ответ. Пары «параметр=значение» разделяются знаком. com / form ? name = Max&email = name@yandex . ru &
. Вариантmethod
используется по умолчанию, но у него есть ограничение: URL не должен получиться длиннее, чем 3000 символов.= "get" post
— данные из формы пакуются в тело формы и отправляются на сервер. В этом случае нет ограничений по объёму данных, поэтому этот способ подойдёт для заполнения базы данных или отправки файлов.
Ещё у атрибута method
может быть третье значение — dialog
. Если <form>
находится внутри <dialog>
, то поля формы не очищаются, а сама форма не делает запроса на сервер. Вместо этого, закрывается диалоговое окно. В статье «Работа с формами» можно узнать, как отправить данные на сервер с помощью JavaScript.
name
— уникальное имя формы. Пользователь его не увидит, зато скрипты смогут найти нужную форму. Например, по этому имени, можно получить доступ к форме из коллекции document
.
autocomplete
— включает или выключает автозаполнение для формы. Браузер может подставить данные, которые пользователь сохранил ранее, например, пароль, номер банковской карты или адрес. Если у пользователя в настройках браузера отключена функция автозаполнения, то этот атрибут уже ни на что не повлияет. Атрибут autocomplete
можно задать и для конкретных элементов. Есть два значения:
on
— значение по умолчанию. Включает автозаполнение для этой формы.off
— выключает автозаполнение. Например, если форма собирает уникальные данные типа капчи («Введите слово с картинки»).
novalidate
— у этого атрибута нет значения. Если его добавить, браузер не будет проверять правильность заполнения формы. Например, верно ли введён адрес почты или URL для тегов <input type
и <input type
соответственно. Обычно браузер проверяет, не пропустили ли вы @
или домен. В том числе, проверяется и заполнение обязательных полей.
enctype
— определяет, какой вид кодирования будет применён к данным из формы. Этот атрибут обязательно надо ставить, если через форму отправляются файлы, в остальных случаях — не обязательно. Есть три варианта кодирования:
application
— это значение по умолчанию. Данные будут кодироваться так, что пробелы превратятся в знак/ x - www - form - urlencoded +
, а символы вроде кириллицы будут представлены в шестнадцатеричном значении. Например, так будет выглядеть имя Степан:%
🤡D0 % A1 % D1 % 82 % D0 % B5 % D0 % B F % D0 % B0 % D0 % B D multipart
— вариант, который надо указать, если через форму отправляются файлы. В этом случае данные не кодируются./ form - data text
— в этом случае пробелы меняются на/ plain +
, а остальные символы передаются без изменений.
accept
— задаёт кодировку, в которой сервер принимает данные из формы. Самая распространённая кодировка — UTF
. Можно указать один вариант или несколько. Например, accept
. В этом случае названия кодировок нужно разделять пробелами. Здесь можно задать значение по умолчанию: accept
. Тогда кодировка будет такой, какая используется на странице с формой.
Подсказки
Скопировано💡 Никогда не используйте method
, если хочется отправить конфиденциальные данные, потому что их можно будет легко прочитать в запросе, который отправляет форма, и даже в адресной строке браузера.
💡 Вариант method
удобен тем, что полученный URL с ответами можно сохранить в закладки. Например, пользователь может заполнить форму и поделиться ссылкой с результатами с кем-нибудь ещё.
Ещё примеры
СкопированоВот простая форма:
<!-- Эта форма отправит значение методом GET — мы получим URL с ответом --> <form action="" method="get"> <label> Имя первого гостя: <input type="text" name="name"> </label> <button type="submit">Сохранить</button> </form><!-- Эта форма отправит данные методом POST --><form action="" method="post"> <label for="post-name"> Имя второго гостя: <input id="post-name" type="text" name="name"> </label> <button type="submit">Сохранить</button></form><!-- Форма с радиокнопками --><form action="" method="post"> <fieldset> <legend>Выберите прожарку</legend> <label> <input type="radio" name="level"> Rare </label> <label> <input type="radio" name="level"checked> Medium </label> <label> <input type="radio" name="level"> Well Done </label> </fieldset></form>
<!-- Эта форма отправит значение методом GET — мы получим URL с ответом --> <form action="" method="get"> <label> Имя первого гостя: <input type="text" name="name"> </label> <button type="submit">Сохранить</button> </form> <!-- Эта форма отправит данные методом POST --> <form action="" method="post"> <label for="post-name"> Имя второго гостя: <input id="post-name" type="text" name="name"> </label> <button type="submit">Сохранить</button> </form> <!-- Форма с радиокнопками --> <form action="" method="post"> <fieldset> <legend>Выберите прожарку</legend> <label> <input type="radio" name="level"> Rare </label> <label> <input type="radio" name="level"checked> Medium </label> <label> <input type="radio" name="level"> Well Done </label> </fieldset> </form>
Попробуем отправить данные, которые введёт пользователь, на почту. Для этого вместо URL-ссылки мы пропишем action
. Ключевое слово mailto
позволяет отправить что угодно на электронную почту. Не забудьте добавить атрибут enctype
тегу <form>
, чтобы письмо отображалось корректно:
<form action="mailto:html@yandex.ru" enctype="text/plain"> <label> Ваше имя <input type="text" name="name" required> </label> <label> Что вы хотите заказать? <input type="text" name="order" required> </label> <button type="submit">Сделать заказ</button></form>
<form action="mailto:html@yandex.ru" enctype="text/plain"> <label> Ваше имя <input type="text" name="name" required> </label> <label> Что вы хотите заказать? <input type="text" name="order" required> </label> <button type="submit">Сделать заказ</button> </form>
На практике
Скопированосоветует Скопировано
🛠 Без тега <form>
форма не будет работать, но это не всё, что нужно для получения данных. Введённые пользователем данные нужно собирать и отправлять на сервер. Уже на сервере с данными что-то будет происходить: будет отправляться письмо на почту или формировать заказ. За обработку и отправку данных отвечают атрибуты method
и action
.
Если у тега формы не указывать ни action
, ни method
, как в примере ниже, то данные никуда не отправятся, а страница перезагрузится:
<form> <label>Имя: <input type="text" name="firstName"></label> <button type="submit">Отправить</button></form>
<form> <label>Имя: <input type="text" name="firstName"></label> <button type="submit">Отправить</button> </form>
Отправка формы с помощью атрибутов action
и method
происходит синхронно — браузер отправляет запрос по адресу и рисует на экран все, что вернётся в ответ. Это приводит к полной перезагрузке страницы.
Можно отправлять формы асинхронно, без перезагрузки страницы, но для этого нужно писать JavaScript код, который будет отправлять запрос, получать ответ и обновлять страницу данными из ответа. Читайте, как делать асинхронные формы в статье «Работа с формами» раздела JavaScript.
советует Скопировано
🛠 Формы очень часто встречаются на сайтах. С их помощью пользователю предлагается оформить подписку, отправить запрос на цену, записаться на приём к врачу, авторизоваться на сайте и тому подобное.
Посвятите время детальному изучению форм. В том числе тому, как их стилизовать. Это отдельная боль — стилизовать разные поля формы крайне муторно. А чтобы делать это кроссплатформенно, нужно изрядно набить руку.