Какие недостатки есть в теге <button>?

Я начал использовать диагностическую таблицу стилей CSS, например, http://snipplr.com/view/6770/css-diagnostics--highlight-deprecated-html-with-css--more/

Одно из предложенных правил выделяет входные теги с типом submit, с рекомендацией использовать <button> в качестве более семантического решения. Каковы преимущества или недостатки <button> с типом submit (например, совместимость с браузером), с которым вы столкнулись?

Просто чтобы прояснить, я понимаю спецификацию <button>, она имеет определенные начало и конец, она может содержать различные элементы, тогда как input является синглетом и не может содержать вещи. То, что я хочу знать по существу, является ли это сломано или нет. Я хотел бы знать, насколько полезна кнопка в настоящее время. Первый ответ, приведенный ниже, похоже, подразумевает, что он, к сожалению, не подходит для использования, за исключением форм.

Изменить на 2015

Пейзаж изменился! У меня есть еще 6 лет опыта работы с кнопками, и браузеры несколько перешли от IE6 и IE7. Поэтому я добавлю ответ, в котором подробно опишу, что я узнал и что я предлагаю.

Ответ 1

Ответ с точки зрения ASP.NET.

Я был взволнован, когда нашел этот вопрос и некоторый код для элемента управления ModernButton, который, в конце концов, является элементом управления <button>.

Итак, я начал добавлять всевозможные эти кнопки, украшенные тегами <img /> внутри них, чтобы они выделялись. И все это отлично поработало... в Firefox и Chrome.

Затем я попробовал IE6 и получил "потенциально опасное значение Request.Form", потому что IE6 отправляет html внутри кнопки, что в моем случае содержит html-теги. Я не хочу отключать флаг validateRequest, потому что мне нравится этот добавленный бит проверки данных.

Итак, я написал несколько javascript, чтобы отключить эту кнопку до отправки. Отлично работал на тестовой странице с помощью одной кнопки, но когда я попробовал ее на реальной странице, у которой были другие теги <button>, она снова взорвалась. Поскольку IE6 представляет ВСЕ кнопки html-кнопок. Итак, теперь у меня есть все виды кода для отключения кнопок перед отправкой.

Те же проблемы с IE7. IE8, к счастью, зафиксировал это.

Хлоп. Я бы порекомендовал не идти по этому пути, если вы используете ASP.NET.

Update:

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

Если вы используете ie8.js script из этой библиотеки: http://code.google.com/p/ie7-js/

Это может получиться просто отлично. IE8.js добавляет IE5-7 к скорости с IE8 с тегом кнопки. Это делает представленное значение реальным значением и отправляется только одна кнопка.

Ответ 2

При использовании <button> всегда указывать тип, поскольку браузеры по умолчанию имеют разные типы.

Это будет работать последовательно во всех браузерах:

  • <button type="submit">...</button>
  • <button type="button">...</button>

Таким образом, вы получаете все <button> добротность, без недостатков.

Ответ 3

Все, что вам нужно знать: W3Schools <button> Тег

Тег поддерживается во всех основных браузерах.

Важно: если вы используете элемент кнопки в форме HTML, разные браузеры будут отправлять разные значения. Internet Explorer отправит текст между тегами <button> и </button>, в то время как другие браузеры будут отправлять содержимое атрибута value. Используйте элемент input для создания кнопок в HTML-форме.

Ответ 4

Плюсы:

  • Метка дисплея не должна совпадать с отправленным значением. Отлично подходит для i18n и "Удалить эту строку"
  • Вы можете включить разметку, такую как <em> и <img>

Минусы:

  • В некоторых версиях MSIE по умолчанию type="button" вместо type="submit" поэтому вам нужно быть явным
  • В некоторых версиях MSIE все <button> будут обрабатываться как успешные, поэтому вы не сможете определить, какая из них была нажата в форме с несколькими кнопками отправки.
  • Некоторые версии MSIE будут отображать отображаемый текст вместо реального значения

С https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button:

В IE7 есть ошибка, при которой при отправке формы с помощью Click me отправленные данные POST приводят к myButton = Click me вместо myButton = foo. IE6 имеет еще худшую ошибку, когда отправка формы через кнопку отправит ВСЕ кнопки формы, с той же ошибкой, что и в IE7. Эта ошибка была исправлена в IE8.

Ответ 5

Важная особенность, о которой нужно знать: в форме, содержащей элемент <button/>, IE6 и IE7 не будут отправлять форму при нажатии элемента <button/>. Другие браузеры, с другой стороны, отправят форму.

Напротив, никакие браузеры не отправят форму, когда будут нажаты элементы <input type="button"/> или <button type="button"/>. И, естественно, все браузеры отправят форму, когда будут нажаты элементы <input type="submit"/> или <button type="submit"/>.

Как говорит @orip ответ, чтобы обеспечить постоянное поведение отправки в браузерах, всегда используйте <button type="button" /> или <button type="submit" /> внутри элемента <form/>. Никогда не оставляйте атрибут type.

Ответ 6

У меня был некоторый опыт работы с причудами <button> сейчас, через 6 лет, так что вот мои предложения:

  • Если вы еще поддерживаете IE6 или IE7, будьте очень осторожны с кнопкой, поведение очень затруднено с этими браузерами, в некоторых случаях подает innerHtml вместо value = "что угодно" и все значения кнопок, а не только одно и подобное поведение. Поэтому тщательно проверьте или избегайте этих браузеров.

  • В противном случае: если вы все еще поддерживаете IE8, <a href='http://example.com'><button></button></a> работает не так, и, возможно, что-то еще, где вы вставляете кнопку внутри элемента, который можно щелкнуть. Поэтому следите за этим.

  • В противном случае: если вы используете <button> главным образом как элемент для клика для вашего javascript и вне формы, сделайте его <button type='button'>, и вы, вероятно, будете в порядке!

  • В противном случае: если вы используете <button> в форме, будьте осторожны, что тип по умолчанию <button> на самом деле <button type='submit'> в (большинстве) случаях, поэтому будьте явным с вашим типом и вашим value, например: <button type='submit' value='1'>Search</button>.

Обратите внимание, что: Используя класс кнопки -mimic, например Bootstrap .btn, вы можете просто сделать такие вещи, как <div> или <a> или даже <button>, точно так, как вы хотите, и в случае из <a> имеют более полезное резервное поведение. Неплохой вариант.

TL;DR; Ок, чтобы использовать, если вам не нравятся древние браузеры, но Bootstrap предоставляет еще более прочные css визуально похожие альтернативы, которые стоит посмотреть.

Ответ 7

Разбито или нет:

Как обычно, ответ: "он отлично работает во всех основных браузерах, но имеет следующие особенности в IE". Я не думаю, что это будет проблемой для вас.

Тег <button> поддерживается всеми основными браузерами. Единственная проблема с поддержкой заключается в том, что Internet Explorer будет отправлять при нажатии кнопки.

Основные браузеры будут отправлять содержимое атрибута value. Internet exploter отправит текст между тегами <button> и </button>, а также отправит значение любого другого в форме, а не только тот, который вы нажали.

Для ваших целей, просто очищая старый HTML, это не должно быть проблемой.

Источники:

Ответ 8

Здесь сайт, который объясняет различия: http://www.javascriptkit.com/howto/button.shtml

В принципе, тег ввода позволяет просто текст (хотя вы можете использовать фоновое изображение), в то время как кнопка позволяет добавлять изображения, таблицы, div и все остальное. Кроме того, он не требует, чтобы он был вложен в тег формы.

Ответ 9

Вы также можете столкнуться с этими проблемами:

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

Ответ 10

насколько я заинтересован, разница между тегами submit и button заключается в следующем:  дает вам возможность отображать другой текст, чем значение элемента

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

product1 : <add to cart>
product2 : <add to cart>
product3 : <add to cart>

тогда вы можете сделать это:

<button name="buy" type="submit" value="product2"> add to cart </button>

Теперь проблема в том, что IE отправит форму со значением = "добавить в корзину" вместо value = "product2"

Самый простой способ работать с этой проблемой - добавить onclick = "this.value = 'product2'"

Итак, это:

<button name="buy" type="submit" value="product2" onclick="this.value='product2'"> add to cart </button>

сделает трюк во всех основных браузерах - я фактически использовал это в форме с несколькими кнопками и работал с Chrome Firefox и IE

Ответ 11

Похоже, что основной причиной использования <button> является возможность разметки CSS этой кнопки и возможность стилизации кнопки с изображениями: (см. здесь http://www.javascriptkit.com/howto/button.shtml)

Однако, я думаю, что более приемлемый подход, который я видел в (X) HTML + CSS, - использовать div и полностью стилизовать его с изображениями и: навести псевдоклассы (имитировать кнопку downpress... не могу добавить более одной ссылки на каждый ответ, так что просто "кнопка div" в google вы увидите множество примеров этого), и с помощью javascript для отправки формы или вызова AJAX... это также имеет еще больший смысл, если вы не используете HTML-формы и делать все сообщения с помощью AJAX.