Если форма отправлена, но не с помощью какой-либо конкретной кнопки, например,
- нажав Enter
- используя
HTMLFormElement.submit()
в JS
Как браузер должен определить, какую из нескольких кнопок отправки, если они есть, использовать как нажатую?
Это важно на двух уровнях:
- вызов
onclick
обработчика события, прикрепленного к кнопке отправки - данные отправляются обратно на веб-сервер
Мои эксперименты до сих пор показали, что:
- при нажатии EnterFirefox, Opera и Safari используют первую кнопку отправки в форме
- при нажатии EnterIE использует либо первую кнопку отправки, либо ни одной вообще, в зависимости от условий, которые я не смог выяснить
- все эти браузеры вообще не используют ни один для отправки JS
Что говорит стандарт?
Если это поможет, вот мой тестовый код (PHP относится только к моему методу тестирования, а не к самому моему вопросу)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>
<body>
<h1>Get</h1>
<dl>
<?php foreach ($_GET as $k => $v) echo "<dt>$k</dt><dd>$v</dd>"; ?>
</dl>
<h1>Post</h1>
<dl>
<?php foreach ($_POST as $k => $v) echo "<dt>$k</dt><dd>$v</dd>"; ?>
</dl>
<form name="theForm" method="<?php echo isset($_GET['method']) ? $_GET['method'] : 'get'; ?>" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
<input type="text" name="method" />
<input type="submit" name="action" value="Button 1" onclick="alert('Button 1'); return true" />
<input type="text" name="stuff" />
<input type="submit" name="action" value="Button 2" onclick="alert('Button 2'); return true" />
<input type="button" value="submit" onclick="document.theForm.submit();" />
</form>
</body></html>
источник
HTML 4 не делает его явным. Текущий рабочий проект HTML5 указывает, что первая кнопка отправки должна быть по умолчанию :
источник
У Andrezj все получилось ... но вот простое кросс-браузерное решение.
Примите форму, подобную этой:
и рефакторинг к этому:
Поскольку спецификация W3C указывает, что несколько кнопок отправки действительны, но не содержит указаний относительно того, как пользовательский агент должен их обрабатывать, производители браузеров остаются для реализации по своему усмотрению. Я обнаружил, что они либо отправят первую кнопку отправки в форме, либо отправят следующую кнопку отправки после поля формы, которое в данный момент имеет фокус.
К сожалению, просто добавив стиль отображения: нет; не будет работать, потому что спецификация W3C указывает, что любой скрытый элемент должен быть исключен из взаимодействия с пользователем. Так что скрывайте это на виду!
Выше приведен пример решения, которое я в итоге поставил в производство. Нажатие клавиши ввода запускает отправку формы по умолчанию, как и ожидалось, даже когда присутствуют другие значения, отличные от значений по умолчанию, и предшествуют кнопке отправки по умолчанию в DOM. Бонус за взаимодействие мыши и клавиатуры с явным пользовательским вводом, избегая обработчиков JavaScript.
Примечание. Вкладка в форму не будет отображать фокус для какого-либо визуального элемента, но все равно будет вызывать выбор невидимой кнопки. Чтобы избежать этой проблемы, просто установите соответствующие атрибуты tabindex и пропустите атрибут tabindex на невидимой кнопке отправки. Несмотря на то, что продвижение этих стилей может показаться неуместным, они не должны мешать каркасу или существующим стилям кнопок вмешиваться в это исправление. Кроме того, эти встроенные стили определенно плохи, но мы здесь проверяем концепции ... не пишем производственный код.
источник
<div style="position: fixed; left: -1000px; top: -1000px />
. Еще одна вещь для беспокойства: просто сворачивание или удаление кнопки из потока страниц с помощью CSS может вызвать проблемы с WAI, потому что программы чтения с экрана все равно увидят кнопку по умолчанию.<input/>
там?Я думаю, что этот пост поможет, если кто-то захочет сделать это с помощью jQuery:
http://greatwebguy.com/programming/dom/default-html-button-submit-on-enter-with-jquery/
Основное решение:
и еще один мне понравился был:
источник
.wich
атрибут. Также нет необходимости прибегать к DOM.keyCode
(или.charCode
в этом отношении).e.preventDefault();
в начало этой функции, чтобы избежать выполнения «настоящей» кнопки по умолчанию. Работает действительно хорошо.У меня была форма с 11 кнопками отправки, и она всегда использовала первую кнопку отправки, когда пользователь нажимал ввод. В другом месте я читал, что не стоит (и не рекомендуется) иметь в форме более одной кнопки отправки, и лучший способ сделать это - использовать кнопку, которую вы хотите использовать по умолчанию, как единственную кнопку отправки в форме. Другие кнопки должны быть превращены в «TYPE = BUTTON» и добавлено событие onClick, которое вызывает вашу собственную процедуру отправки в Javascript. Что-то вроде этого :-
Здесь button3 является значением по умолчанию, и хотя вы программно отправляете форму с другими кнопками, процедура mjsubmit проверяет их. НТН.
источник
Теперь это можно решить с помощью
flexbox
:HTML
CSS
Explaination
Использование гибкого окна, мы можем изменить порядок элементов в контейнере , который использует
display: flex
также при помощи правила CSS:flex-direction: row-reverse
. Это не требует CSS или скрытых элементов. Для старых браузеров, которые не поддерживают flexbox, они все еще получают работоспособное решение, но элементы не будут обращены вспять.Демо-
версия http://codepen.io/Godwin/pen/rLVKjm
источник
Я боролся с тем же вопросом, так как у меня была кнопка «Отправить», посередине которой перенаправлено отправить на другую страницу, вот так:
Когда пользователь нажимал клавишу ввода, эта кнопка была нажата вместо другой кнопки отправки.
Итак, я сделал несколько примитивных тестов, создав из с несколькими кнопками отправки и различными параметрами видимости и оповещения о событиях onclick, какая кнопка была нажата: https://jsfiddle.net/aqfy51om/1/
Браузеры и ОС, которые я использовал для тестирования:
WINDOWS
OSX
Большинство из этих браузеров нажимали самую первую кнопку, несмотря на примененные параметры видимости, кроме IE и Safari, которые нажимали третью кнопку, которая «видна» внутри «скрытого» контейнера:
Итак, мое предложение, которое я собираюсь использовать сам:
Если в вашей форме есть несколько кнопок отправки с различным значением, включите кнопку «Отправить» с действием по умолчанию в начале формы:
style="width: 0; height: 0; overflow: hidden;"
РЕДАКТИРОВАТЬ Другим вариантом может быть смещение кнопки (все еще в начале от)
style="position: absolute; left: -9999px; top: -9999px;"
, только что попробовал в IE - сработало, но я понятия не имею, что еще он может испортить, например, печать ..источник
Из ваших комментариев:
Я бросаю
<input type="hidden" value="form_name" />
в каждой форме.При отправке с использованием JavaScript: добавляйте события отправки в формы, а не щелкайте события на их кнопках. Пользователи Saavy не очень часто касаются мыши.
источник
Если в одной форме имеется несколько кнопок отправки, и пользователь нажимает клавишу ВВОД, чтобы отправить форму из текстового поля, этот код переопределяет функциональность по умолчанию, вызывая событие отправки в форме из события нажатия клавиши. Вот этот код:
источник
Странно, что первая кнопка Enter всегда идет к первой кнопке, независимо от того, видна она или нет, например, с помощью jquery
show/hide()
. Добавление атрибута.attr('disabled', 'disabled')
предотвращает получение кнопки Enter submit полностью. Это проблема, например, при настройке видимости кнопки « Вставить / Редактировать + Удалить» в диалоговых окнах записи. Я нашел менее хакерское и простое размещение Edit перед Insertи используйте код JavaScript:
источник
мой рецепт:
Он отправит скрытое поле по умолчанию, если ни одна из кнопок не нажата.
если они нажаты, у них есть предпочтение, и его значение передается.
источник
Другое решение, которое я использовал, это просто иметь одну кнопку в форме и подделывать другие кнопки.
Вот пример:
Затем я создаю элементы span, чтобы они выглядели как кнопки. Слушатель JS наблюдает за пролетом и выполняет желаемую операцию после щелчка.
Не обязательно подходит для всех ситуаций, но по крайней мере это довольно легко сделать.
источник
Из спецификации HTML 4 :
Это означает, что при наличии более 1 кнопки отправки и ни одной не активированной (нажатой) ни одна не должна быть успешной.
И я бы сказал, что это имеет смысл: представьте себе огромную форму с несколькими кнопками отправки. Вверху есть кнопка «удалить эту запись», затем следует множество входов, а внизу кнопка «обновить эту запись». Пользователь, нажимающий клавишу ввода, находясь в поле внизу формы, никогда не будет подозревать, что он неявно нажимает кнопку «удалить эту запись» сверху.
Поэтому я думаю, что не стоит использовать первую или любую другую кнопку, если пользователь не определил (не нажал) одну. Тем не менее, браузеры делают это, конечно.
источник
РЕДАКТИРОВАТЬ: Извините, когда писал этот ответ, я думал о кнопках отправки в общем смысле. Ответ ниже не о нескольких
type="submit"
кнопках, так как он оставляет только однуtype="submit"
и меняет другую наtype="button"
. Я оставляю ответ здесь в качестве справки на тот случай, если поможет кто-то, кто может изменитьtype
свою форму:Чтобы определить, какая кнопка нажимается при нажатии клавиши ввода, вы можете пометить ее
type="submit"
, а другие кнопки пометить ихtype="button"
. Например:источник