Кнопки в HTML: чем button отличается от input type=submit

У тега button есть три типа: submit (отправляет форму), reset (сбрасывает поля) и button (просто кнопка, сама ничего не делает). Если тип не указан, кнопка по умолчанию ведёт себя как submit - частая причина случайной отправки формы. У input type="submit" похожая роль, но button может содержать разметку внутри, а input - только текст в атрибуте value.

Нажми "Просто кнопка" - ничего не изменится. Теперь нажми "Кнопка без type" - текст ниже поменяется, хотя ты не нажимал ничего похожего на "Отправить". Вот что значит тип по умолчанию.

Тип кнопки в HTML по умолчанию: button без type

Если у button не указать атрибут type, браузер сам считает его type="submit" - это поведение по умолчанию, а не случайность. Из-за этого кнопка, добавленная просто для JS-действия (открыть модальное окно, переключить вкладку) и случайно оказавшаяся внутри form, при клике неожиданно отправляет форму или перезагружает страницу.

<button type="button" onclick="...">Открыть окно</button> - явный type="button" гарантирует, что клик не отправит форму.

<button onclick="...">Открыть окно</button> - без type кнопка по умолчанию submit: клик внутри формы отправит её, хотя это явно не входило в план.

Кнопка с содержимым в HTML: чем button отличается от input type=submit

input - это тег без содержимого: подпись кнопки задаётся только текстом в атрибуте value. У button подпись - это его содержимое между открывающим и закрывающим тегом, а значит внутри можно разместить не только текст, но и картинку, иконку или другую разметку.

<button type="submit"><img src="..." alt=""> Оформить заказ</button> - картинка и текст вместе, потому что button принимает содержимое.

<input type="submit" value="<img src=...> Оформить заказ"> - value это просто текст: теги внутри не превратятся в картинку, а покажутся как обычные символы.

Из истории input type="submit" существует с самого начала форм в HTML - RFC 1866 "HTML 2.0" (ноябрь 1995). Тег button появился на два года позже - в HTML 4.0 (рекомендация W3C от 18 декабря 1997, исправленное издание от 24 апреля 1998), в одной волне с label, fieldset и legend, как более гибкая альтернатива с поддержкой содержимого. Доверие к button первое время подрывал реальный баг Internet Explorer 6 и 7: у кнопки вида <button name="x" value="y">Текст</button> IE отправлял на сервер видимый текст кнопки вместо значения value - в отличие от всех остальных браузеров. Именно отсюда родился долгоживущий совет "не используй button для отправки формы", который к эпохе IE8 уже устарел.

Частые ошибки новичков

ОшибкаЧто происходитКак исправить
Забыть type="button" у кнопки для JS-действия внутри form Кнопка получает тип submit по умолчанию и неожиданно отправляет или перезагружает форму Всегда явно указывать type="button" для кнопок, которые не должны отправлять форму
Перепутать input type="button" и input type="submit" Кнопки выглядят одинаково, но одна отправляет форму, а другая - нет Выбирать type по реальному действию кнопки, а не по внешнему виду
Пытаться вставить картинку или разметку в value у input value - это просто текст: теги внутри покажутся как символы, а не отрендерятся Использовать button с содержимым или отдельный input type="image"

Шпаргалка

ВариантЧто делает
button (без type)По умолчанию ведёт себя как submit - отправляет форму
button type="button"Просто кнопка, сама ничего не делает - только JS-обработчики
button type="reset"Сбрасывает все поля формы к начальным значениям
input type="submit"Отправляет форму, подпись - только текст в value
button vs inputbutton принимает содержимое (текст, картинки, разметку), input - только текст в value

Коротко: отвечаем на вопросы

Чем отличается button от input type=submit?

Обе кнопки могут отправлять форму, но у них разное содержимое: button может содержать разметку внутри себя (текст, картинки, вложенные элементы), а у input подпись задаётся только текстом в атрибуте value - никакая разметка внутри value не отрендерится.

Как не дать кнопке случайно отправить форму?

Явно указать type="button" у кнопок, которые не должны отправлять форму. Без этого браузер по умолчанию считает button кнопкой типа submit - это реальная и широко известная проблема: попытка сменить умолчание в спецификации была отклонена именно из-за огромного объёма уже существующей разметки, которая на неё полагается.

Какой тип у button по умолчанию, если не указать type?

submit. Это подтверждено и спецификацией, и поведением всех современных браузеров - button без явного type ведёт себя точно так же, как button type="submit".

Можно ли вставить картинку в кнопку отправки формы?

Да, но не через input type="submit" - там подпись это просто текст. Картинку можно вставить внутрь button (он принимает содержимое) или использовать отдельный input type="image", специально предназначенный для кнопки-картинки.

Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×