javascript — Теги form, input, button — непонятное поведение
Вопрос задан
Изменён 1 год 4 месяца назад
Просмотрен 54 раза
Суть проблемы: когда инпут и кнопка обернуты в форму, то при нажатии Enter на инпуте, срабатывает событие click на кнопке. Почему так происходит и как сделать так, чтобы клик на кнопке не срабатывал?
const btn = document.querySelector('button') btn.addEventListener('click', (e) => { console.log(e.type, e.target.nodeName) }) const form = document.querySelector('form') form.addEventListener('submit', (e) => { e.preventDefault() })
<form action=""> <input type="text"> <button>Кнопка</button> </form>
- javascript
- html
- form
- события
Спасибо комментариям, подсказали правильное направление. Оказалось, что проблему можно решить, если разорвать связь между кнопкой и формой. Для этого кнопке надо установить атрибут form
, который будет указывать на другую форму. В моем случае, я, вообще, оставил этот атрибут пустым
const btn = document.querySelector('button') btn.addEventListener('click', (e) => { console.log(e.type, e.target.nodeName) }) const form = document.querySelector('form') form.addEventListener('submit', (e) => { e.preventDefault() })
<form action=""> <input type="text"> <button form="">Кнопка</button> </form>2
Зарегистрируйтесь или войдите
Регистрация через Google Регистрация через Facebook Регистрация через почтуОтправить без регистрации
ПочтаНеобходима, но никому не показывается
Отправить без регистрации
ПочтаНеобходима, но никому не показывается
By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.
html — против . Что использовать?
спросил
Изменено 22 дня назад
Просмотрено 679 тысяч раз
При просмотре большинства сайтов (включая SO), большинство из них используют:
вместо:
<кнопка>
- Каковы основные различия между ними, если они есть?
- Есть ли веские причины использовать один вместо другого?
- Есть ли веские причины для их объединения?
- Приводит ли использование
- html
- кнопка
- совместимость
- Вот страница с описанием различий (в основном вы можете поместить html в
<кнопка>
) - И еще одна страница с описанием того, почему люди избегают
Другая проблема IE при использовании
:
3И пока мы говорим об IE, это есть пара ошибок, связанных с ширина пуговиц. Это будет таинственно добавить дополнительное дополнение, когда вы пытаетесь чтобы добавить стили, то есть вы должны добавить крошечный хак, чтобы получить вещи под контроль.
Как примечание,
будет неявно отправлять, что может вызвать проблемы, если вы хотите использовать кнопку в форме без ее отправки. Таким образом, еще одна причина использовать
(или
)
Редактировать — подробнее
Без типа, кнопка
неявно получает тип отправить
. Неважно, сколько кнопок отправки или входов в форме, любая из них, которая явно или неявно указана как submit, при нажатии отправит форму.
Есть 3 поддерживаемых типа кнопки
отправить || "отправляет форму при нажатии (по умолчанию)" сбросить || "сбрасывает поля в форме при клике" кнопка || «кликабельно, но без какого-либо обработчика событий, пока он не будет назначен»0
Эта статья предлагает довольно хороший обзор различий.
Со страницы:
0Кнопки, созданные с помощью элемента BUTTON, функционируют точно так же, как кнопки созданный с помощью элемента INPUT, но они предлагают более богатую визуализацию возможности: элемент BUTTON может иметь содержание. Например, КНОПКА элемент, содержащий изображение функции похожи и могут напоминать Элемент INPUT, тип которого установлен на «изображение», но тип элемента BUTTON позволяет содержание.
Элемент кнопки — W3C
Внутри элемента
вы можете разместить содержимое, например текст или изображения.
Это разница между этим элементом и кнопками, созданными с помощью элемента
.
Цитата
Важно! Если вы используете элемент кнопки в HTML-форме, разные браузеры будут отправлять разные значения. Internet Explorer отправит текст между тегами
и
, в то время как другие браузеры отправят содержимое атрибута value. Используйте элемент ввода для создания кнопок в HTML-форме.
Откуда: http://www.w3schools.com/tags/tag_button.asp
Если я правильно понимаю, ответ — совместимость и согласованность ввода из браузера в браузер
Я процитирую статью The Difference Between Anchors, Inputs and Buttons:
Anchors (элемент
) представляют собой гиперссылки, ресурсы, на которые человек может перейти или скачать в браузере. Если вы хотите, чтобы ваш пользователь мог перейти на новую страницу или загрузить файл, используйте привязку.
Ввод (
) представляет собой поле данных: поэтому некоторые пользовательские данные вы хотите отправить на сервер. Существует несколько типов ввода, связанных с кнопками:
-
-
-
<тип ввода = "файл">
-
<тип ввода="сброс">
-
<тип ввода="кнопка">
Каждый из них имеет значение, например « файл » используется для загрузки файла, « сброс » очищает форму, а « отправить » отправляет данные на сервер. Проверьте ссылку W3 на MDN или на W3Schools.
Элемент button (
весьма универсален:
- вы можете вкладывать элементы в кнопку, такие как изображения, абзацы или заголовки; Кнопки
- также могут содержать псевдоэлементы
::before
и::after
; Кнопки - поддерживают атрибут
disabled
. Это позволяет легко поворачивать их включать и выключать.
Опять же, проверьте ссылку W3 для тега
на MDN или на W3Schools.
Хотя это очень старый вопрос и, возможно, уже не актуален, имейте в виду, что большинство проблем, с которыми раньше сталкивался тег
, больше не существуют, и поэтому настоятельно рекомендуется его использовать.
Если вы не можете этого сделать по разным причинам, просто не забудьте добавить атрибут role=»button» в свой тег по мере доступности. Эта статья достаточно информативна: https://www. deque.com/blog/accessible-aria-buttons/
Цитирование страницы форм в руководстве HTML:
Кнопки, созданные с помощью элемента BUTTON, функционируют точно так же, как кнопки, созданные с помощью элемента INPUT, но они предлагают более широкие возможности визуализации: элемент BUTTON может иметь содержимое. Например, элемент BUTTON, который содержит изображение, может напоминать элемент INPUT, тип которого установлен на «изображение», но тип элемента BUTTON допускает содержимое.
Используйте кнопку из элемента ввода, если вы хотите создать кнопку в форме. И используйте тег кнопки, если вы хотите создать кнопку для действия.
1<кнопка>
- по умолчанию ведет себя так, как если бы у него был атрибут «type=»submit»
- можно использовать как без формы, так и в формах.
- разрешено текстовое или html-содержимое
- разрешены псевдоэлементы css (например: раньше) Имя тега
- обычно уникально для одной формы
против
- тип должен быть установлен на «отправить», чтобы вести себя как отправляющий элемент
- можно использовать только в формах.
- разрешено только текстовое содержимое
- нет псевдоэлементов css
- то же имя тега, что и у большинства элементов форм (входов)
—
в современных браузерах оба элемента легко стилизуются с помощью css, но в большинстве случаев предпочтительнее элемент
, так как вы можете стилизовать больше с помощью внутренних html и псевдоэлементов
Что касается стилей CSS, то < button type="submit">Пример
лучше, поскольку он дает вам возможность использовать псевдоклассы CSS :before
и :after
, которые могут помочь.
Из-за того, что
визуально отличается от
или
при стилизации с помощью классов в определенных ситуациях, я избегаю их.
Стоит отметить, что текущий лучший ответ был написан в 2009 году. IE6 сейчас не вызывает беспокойства, поэтому 9Последовательность укладки 0027 в моих глазах выходит на первое место.
Я просто хочу добавить кое-что к остальным ответам здесь. Элементы input считаются пустыми или недействительными элементами (другими пустыми элементами являются area, base, br, col, hr, img, input, link, meta и param. Вы также можете проверить здесь), что означает, что они не могут иметь никакого содержимого. Помимо отсутствия содержимого, пустые элементы не могут иметь никаких псевдоэлементов, таких как ::after и ::before , что я считаю большим недостатком.
Существует большая разница, если вы используете jQuery. jQuery знает о большем количестве событий для ввода, чем для кнопок. На кнопках jQuery знает только о событиях «щелчок». При вводе jQuery знает о событиях «щелчок», «фокус» и «размытие».
Вы всегда можете привязать события к своим кнопкам по мере необходимости, но просто имейте в виду, что события, о которых jQuery автоматически знает, отличаются. Например, если вы создали функцию, которая выполнялась всякий раз, когда на вашей странице происходило событие «фокусировка», вход запускал функцию, а кнопку — нет.
2
может содержать HTML. Более того, стилизовать с помощью CSS намного проще, и стиль фактически применяется во всех браузерах. Однако у Internet Explorer (Eww! IE!) есть некоторые недостатки. Internet Explorer неправильно определяет атрибут value, используя в качестве значения содержимое тега. Все значения в форме отправляются на сервер, независимо от того, нажата кнопка или нет. Это делает использование его в качестве
сложно и больно.
, с другой стороны, не имеет никаких проблем со значением или обнаружением, но, тем не менее, вы не можете добавить HTML, как с помощью
. Его также сложнее стилизовать, и стиль не всегда хорошо работает во всех браузерах. Надеюсь, это помогло.
Кроме того, одно из отличий может исходить от поставщика библиотеки и того, что они кодируют. например, здесь я использую платформу Cordova в сочетании с мобильным угловым пользовательским интерфейсом, и хотя теги input/div/etc хорошо работают с ng-click, кнопка может привести к сбою отладчика Visual Studio, безусловно, из-за различий, которые вызвал программист; обратите внимание, что ответ MattC указывает на ту же проблему, jQuery - это просто библиотека, и провайдер не подумал о некоторых функциях для одного элемента, которые он/она предоставляет для другого. поэтому, когда вы используете библиотеку, вы можете столкнуться с проблемой с одним элементом, с которой вы не столкнетесь с другим. и просто популярный как input
, в основном будет фиксированным, просто потому, что он более популярен.
Также стоит отметить, что атрибут disabled плохо работает на кнопке для ios-safari (см. также - комментарий @ Khris Vandal). Это случилось и со мной.
В соответствии с целью его использования, если вы использовали для php, советую вам использовать ввод, чтобы сделать, когда ввод работает, и что делает после нажатия на него.
1input type=submit — кнопка отправки
ⓘ тип ввода=отправить – кнопка отправки # T
вход
элемент
с атрибутом типа, чей
значение " submit
" представляет собой кнопку для
отправка формы.
Допустимое содержимое #
пустой (пустой элемент)
Разрешенные атрибуты #
глобальные атрибуты & имя & неполноценный & форма & тип★ & ценить и формирование и автофокус & тип формы & метод формы & цель формы и формировать
- ⓘ глобальные атрибуты
- Любые атрибуты, разрешенные глобально.
- ⓘ имя = строка #
- Часть имени пары имя/значение, связанная с этим элемент для отправки формы.
- ⓘ отключен = "неполноценный" или "" (пустая строка) или пустая #
- Указывает, что элемент представляет отключенный контроль.
- ⓘ форма = Идентификационная ссылка НОВЫЙ #
- Значение идентификатор атрибут на форма с которым связать элемент.
- тип = "отправить" #
- Указывает, что его вход элемент представляет собой кнопку для отправка формы.
- значение = строка #
- Задает значение для вход элемент.
- ⓘ формация = непустой URL-адрес, потенциально окруженный пробелами НОВЫЙ #
- Действие отправки формы для элемента.
- ⓘ автофокус = "автофокус" или "" (пустая строка) или пустая НОВЫЙ #
- Указывает, что элемент представляет элемент управления, к которому UA предназначен для того, чтобы сосредоточить внимание, как только документ загружен. 903:50 ⓘ formenctype = "приложение/x-www-form-urlencoded" или "составные/данные формы" или "текст/обычный" NEW #
- Тип MIME, с которым UA должен ассоциировать это элемент для отправки формы.
- ⓘ метод формы = "получить" или "опубликовать" NEW #
- Метод HTTP, с которым UA должен связываться этот элемент для отправки формы.
- ⓘ цель формы = имя контекста просмотра или ключевое слово НОВЫЙ #
- А контекст просмотра имя или ключевое слово, представляющее цель контроля.
- Любой
нить
это одно из следующего:
- а имя контекста просмотра
- любой
совпадение без учета регистра
для одной из следующих литеральных строк:
"
_пусто
", "_себя
", "_родительский
", или "_верхний
".
- ⓘ формировать валидировать = "формировать" или "" (пустая строка) или пустая НОВЫЙ #
- Указывает, что элемент представляет собой элемент управления, значение не предназначено для проверки во время формы подчинение.
Дополнительные ограничения и предупреждения #
- Ввод интерактивного элемента не должен появляются как потомки элемента a.
- Ввод интерактивного элемента не должен отображаться как потомок элемента кнопки.
- Любой элемент ввода, потомок элемента метки с атрибутом for должен иметь Значение идентификатора, которое соответствует этому атрибуту.
- Атрибут списка элемента ввода должен ссылаться на элемент списка данных.
- Ввод элемента с типом атрибута чье значение «кнопка» должно иметь непустое значение атрибута.
- Атрибут usemap в элементе ввода устарел. Используйте элемент img вместо элемента ввода для карт изображений.
- Атрибут align элемента ввода устарел. Вместо этого используйте CSS.
Отсутствие тега #
вход элемент является пустым элементом. Вход элемент должен иметь начальный тег но не должен иметь конечный тег.