Допустим, вы создали мастер в форме HTML. Одна кнопка идет назад, а другая - вперед. Поскольку кнопка назад появляется первой в разметке, когда вы нажимаете Enter, она будет использовать эту кнопку для отправки формы.
Пример:
<form>
<!-- Put your cursor in this field and press Enter -->
<input type = "text" name = "field1" />
<!-- This is the button that will submit -->
<input type = "submit" name = "prev" value = "Previous Page" />
<!-- But this is the button that I WANT to submit -->
<input type = "submit" name = "next" value = "Next Page" />
</form>Я хотел бы решить, какая кнопка используется для отправки формы, когда пользователь нажимает Enter. Таким образом, когда вы нажмете Enter, мастер перейдет на следующую страницу, а не на предыдущую. Для этого нужно использовать tabindex?






Дайте вашим кнопкам отправки такое же имя, как это:
<input type = "submit" name = "submitButton" value = "Previous Page" />
<input type = "submit" name = "submitButton" value = "Next Page" />
Когда пользователь нажимает Enter и запрос переходит на сервер, вы можете проверить значение submitButton в коде на стороне сервера, который содержит набор пар форм name/value. Например, в ASP Classic:
If Request.Form("submitButton") = "Previous Page" Then
' Code for the previous page
ElseIf Request.Form("submitButton") = "Next Page" Then
' Code for the next page
End If
Ссылка: Использование нескольких кнопок отправки в одной форме
Это не то, о чем спрашивал пользователь. Пользователь хотел знать, как контролировать, какая кнопка отправки в форме активируется при нажатии клавиши ввода, т.е. это кнопка по умолчанию.
не работает в приложении I18n, где вы даже не знаете названия кнопки.
В какой системе или технологическом решении сам сервер не знал бы, какая метка использовалась для кнопки «Далее» и «Назад»? Разве сервер не сгенерировал кнопки «Далее» и «Назад»? (Если локализация выполняется на стороне клиента, я полагаю, что сервер может не знать, но я никогда не слышал об этом для HTML)
В этом ответе полностью отсутствует вопрос, скорее всего, это другой вопрос. Почему так много голосов за ??? Не говоря уже о том, что никогда не следует проверять метку кнопки ... вызывает много проблем. Даже простой случай: «мы должны сократить строку до« Предыдущая страница »» испортит функциональность вашего сайта.
Измените предыдущий тип кнопки на такую:
<input type = "button" name = "prev" value = "Previous Page" />
Теперь кнопка Следующий будет по умолчанию, плюс вы также можете добавить к ней атрибут default, чтобы ваш браузер выделил ее следующим образом:
<input type = "submit" name = "next" value = "Next Page" default />
default вы говорите? There is no "default" attribute, which would be valid: w3.org/html/wg/drafts/html/master/… (not in HTML5, HTML 4.01 Transitional/Strict, XHTML 1.0 Strict). And I don't see why changing the input type from submit to button would be better. You can have multiple submit type input elements in one form without a problem. I don't really understand why this answer is so upvoted.
Наличие ввода типа «кнопка» не выполняет действие формы. У вас может быть onclick или что-то в этом роде, таким образом выполняя другую функцию, чем действие формы «по умолчанию» (которое выполняется нажатием кнопки типа «отправить»). Это то, что я искал, и поэтому я проголосовал за это. Не могу говорить об атрибуте "default", это не было частью моей проблемы;) Тем не менее, спасибо за ваше разъяснение.
@ Sk8erPeter, @Jonas .... хм .. Я подозреваю, что этот атрибут default является глобальным атрибутом; перечисляемый атрибут .., который относится к состояниям перечисления: w3.org/html/wg/drafts/html/master/…. кроме этого пункта ... аспект кнопки этого ответа не является ответом ... это 'условное предложение' или запрос (сам вопрос).
неважно ... Я только что понял, что он на самом деле предоставляет обходной путь в этом ответе ... превращая первый ввод в кнопку, чтобы второй ввод вызывал событие щелчка при нажатии клавиши ввода ... хотя ... все еще условно
@Jonas: да, type = "button" не отправляет форму, type = "submit" отправляет, но изменение типа этих кнопок определенно не является решением, потому что эти кнопки в основном должны вести себя одинаково - вопрос OP заключался в том, как сделать «Далее» Кнопка по умолчанию для нажатия клавиши Enter. И в принятом ответе есть возможное решение.
@BrettCaswell: изменение типа этих кнопок - плохой обходной путь (см. Мой предыдущий комментарий). В HTML нет действительного атрибута default для тегов input (как я уже говорил ранее), и (популярные) браузеры НЕ будут выделять кнопку с этим атрибутом, что означает, что нет нестандартной реализации этого атрибута, поэтому я все еще не делаю этого. Я не знаю, о чем говорил @Wally Lawless и почему этот ответ так переоценен. В HTML5 введен только один действительный атрибут default, НО только для тега <track>: developer.mozilla.org/en-US/docs/Web/HTML/Element/track
Если тот факт, что первая кнопка используется по умолчанию, одинаков для всех браузеров, поместите их в исходный код правильно, а затем используйте CSS для переключения их видимых положений.
float их влево и вправо, например, для визуального переключения.
Я бы использовал JavaScript для отправки формы. Функция будет запускаться событием OnKeyPress элемента формы и определять, был ли выбран ключ Enter. Если это так, он отправит форму.
Вот две страницы, которые объясняют, как это сделать: 1, 2. Исходя из этого, вот пример использования (на основе здесь):
<SCRIPT TYPE = "text/javascript">//<!--
function submitenter(myfield,e) {
var keycode;
if (window.event) {
keycode = window.event.keyCode;
} else if (e) {
keycode = e.which;
} else {
return true;
}
if (keycode == 13) {
myfield.form.submit();
return false;
} else {
return true;
}
}
//--></SCRIPT>
<INPUT NAME = "MyText" TYPE = "Text" onKeyPress = "return submitenter(this,event)" />
Что будет, если отключен javascript?
You shouldn't use чтобы закомментировать JS, эти теги не являются языковыми токенами Javascript
@Marecky They're not to comment out JS. They are ignored when parsing the contents of
Используя приведенный вами пример:
<form>
<input type = "text" name = "field1" /><!-- Put your cursor in this field and press Enter -->
<input type = "submit" name = "prev" value = "Previous Page" /> <!-- This is the button that will submit -->
<input type = "submit" name = "next" value = "Next Page" /> <!-- But this is the button that I WANT to submit -->
</form>
Если вы нажмете «Предыдущая страница», будет отправлено только значение «prev». Если вы нажмете «Следующая страница», будет отправлено только значение «следующая».
Если, однако, вы нажмете Enter где-нибудь в форме, ни «предыдущая», ни «следующая» не будут отправлены.
Таким образом, используя псевдокод, вы можете сделать следующее:
If "prev" submitted then
Previous Page was click
Else If "next" submitted then
Next Page was click
Else
No button was click
Никогда не бывает ситуации (без использования js), когда ни одна из кнопок не срабатывает. Если вы нажмете ENTER, первая кнопка в коде перехватит событие. В html-примере это кнопка prev.
Если вы действительно хотите, чтобы он работал как диалог установки, просто переключите фокус на кнопку «Далее» OnLoad.
Таким образом, если пользователь нажимает Return, форма отправляется и отправляется вперед. Если они хотят вернуться, они могут нажать Tab или нажать кнопку.
Они означают, что кто-то заполняет форму и возвращает нажатие в текстовом поле.
Это невозможно сделать с помощью чистого HTML. Для этого трюка вы должны полагаться на JavaScript.
Однако, если вы разместите две формы на странице HTML, вы сможете это сделать.
Form1 будет иметь предыдущую кнопку.
Form2 будет иметь любые пользовательские вводы + следующая кнопка.
Когда пользователь нажимает Enter в Form2, срабатывает кнопка Next submit.
Надеюсь, это поможет. Я просто проделываю трюк float, перемещая кнопки вправо.
Таким образом, кнопка Prev остается слева от кнопки Next, но Next занимает первое место в структуре HTML:
.f {
float: right;
}
.clr {
clear: both;
}<form action = "action" method = "get">
<input type = "text" name = "abc">
<div id = "buttons">
<input type = "submit" class = "f" name = "next" value = "Next">
<input type = "submit" class = "f" name = "prev" value = "Prev">
<div class = "clr"></div><!-- This div prevents later elements from floating with the buttons. Keeps them 'inside' div#buttons -->
</div>
</form>Преимущества по сравнению с другими предложениями: нет кода JavaScript, доступен, и обе кнопки остаются type = "submit".
Не делайте этого, не изменив также порядок вкладок, чтобы нажатие кнопки вкладки циклически перемещало кнопки по мере их появления на экране.
К сожалению, это работает, только если кнопки расположены относительно близко друг к другу. В более сложных ситуациях, таких как большая страница с несколькими кнопками, расположенными в каждом углу, но все в одной форме, это просто неуправляемо.
Это работает без JavaScript или CSS в большинстве браузеров:
<form>
<p><input type = "text" name = "field1" /></p>
<p><a href = "previous.html">
<button type = "button">Previous Page</button></a>
<button type = "submit">Next Page</button></p>
</form>
Firefox, Opera, Safari и Google Chrome работают.
Проблема, как всегда, в Internet Explorer.
Эта версия работает при включенном JavaScript:
<form>
<p><input type = "text" name = "field1" /></p>
<p><a href = "previous.html">
<button type = "button" onclick = "window.location='previous.html'">Previous Page</button></a>
<button type = "submit">Next Page</button></p>
</form>
Итак, недостаток этого решения:
Предыдущая страница не работает, если вы используете Internet Explorer с отключенным JavaScript.
Имейте в виду, кнопка возврата все еще работает!
Без javascript вы не сможете активировать кнопку "предыдущая страница", потому что type = "button"!
Проблема с вашим предложением заключается в том, что button type = "button" не будет публиковать форму, поэтому в основном ничего не делает, в то время как вторая версия с привязкой создаст GET вместо POST.
Вы можете сделать это с помощью CSS.
Поместите кнопки в разметку сначала кнопкой Next, затем кнопкой Prev.
Затем используйте CSS, чтобы расположить их так, как вы хотите.
<input type = "submit" name = "prev" value = "Previous Page">
<input type = "submit" name = "prev" value = "Next Page">
Оставьте названия всех кнопок отправки одинаковыми: «prev».
Единственное отличие - это атрибут value с уникальными значениями. Когда мы создаем скрипт, эти уникальные значения помогут нам выяснить, какая из кнопок отправки была нажата.
И напишите следующую кодировку:
btnID = ""
if Request.Form("prev") = "Previous Page" then
btnID = "1"
else if Request.Form("prev") = "Next Page" then
btnID = "2"
end if
Проблема в том, что нажатие Enter в текстовом поле отправит форму с первой кнопкой отправки, а не с предполагаемой (второй в примере). Узнать, какая кнопка отправки использовалась для отправки формы, несложно, и вопрос не в этом!
Почему name = "perv"?
Иногда решения, предоставленного @palotasb, недостаточно. Есть случаи использования, когда, например, кнопка «Фильтр» для отправки размещается над такими кнопками, как «Далее» и «Назад». Я нашел обходной путь для этого: копировать кнопка отправки, которая должна действовать как кнопка отправки по умолчанию в скрытом div и поместить ее в форму над любой другой кнопкой отправки. Технически он будет отправлен другой кнопкой при нажатии Enter, чем при нажатии на видимую кнопку Next. Но поскольку имя и значение совпадают, в результате нет никакой разницы.
<html>
<head>
<style>
div.defaultsubmitbutton {
display: none;
}
</style>
</head>
<body>
<form action = "action" method = "get">
<div class = "defaultsubmitbutton">
<input type = "submit" name = "next" value = "Next">
</div>
<p><input type = "text" name = "filter"><input type = "submit" value = "Filter"></p>
<p>Filtered results</p>
<input type = "radio" name = "choice" value = "1">Filtered result 1
<input type = "radio" name = "choice" value = "2">Filtered result 2
<input type = "radio" name = "choice" value = "3">Filtered result 3
<div>
<input type = "submit" name = "prev" value = "Prev">
<input type = "submit" name = "next" value = "Next">
</div>
</form>
</body>
</html>
Для этого достаточно изменить порядок табуляции. Будь проще.
Другой простой вариант - поместить кнопку возврата после кнопки отправки в HTML-коде, но смещать ее влево, чтобы она отображалась на странице перед кнопкой отправки.
Порядок табуляции игнорируется при выборе кнопки по умолчанию. Согласно спецификации HTML: A form element's default button is the first submit button in tree order whose form owner is that form element.
Вот что я пробовал:
if, которая будет выполнять необходимое действие при нажатии любой кнопки.<form>
<input type = "text" name = "field1" /> <!-- Put your cursor in this field and press Enter -->
<input type = "submit" name = "prev" value = "Previous Page" /> <!-- This is the button that will submit -->
<input type = "submit" name = "next" value = "Next Page" /> <!-- But this is the button that I WANT to submit -->
</form>
В PHP
if (isset($_POST['prev']))
{
header("Location: previous.html");
die();
}
if (isset($_POST['next']))
{
header("Location: next.html");
die();
}
Проблема в том, что нажатие Enter в текстовом поле отправит форму с первой кнопкой отправки, а не с предполагаемой (второй в примере). Узнать, какая кнопка отправки использовалась для отправки формы, несложно, и вопрос не в этом!
Если у вас есть несколько активных кнопок на одной странице, вы можете сделать что-то вроде этого:
Отметьте первую кнопку, которую вы хотите активировать при нажатии клавиши Enter, как кнопку по умолчанию в форме. Для второй кнопки свяжите ее с кнопкой Backspace на клавиатуре. Код события Backspace - 8.
$(document).on("keydown", function(event) {
if (event.which.toString() == "8") {
var findActiveElementsClosestForm = $(document.activeElement).closest("form");
if (findActiveElementsClosestForm && findActiveElementsClosestForm.length) {
$("form#" + findActiveElementsClosestForm[0].id + " .secondary_button").trigger("click");
}
}
});<script src = "https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.min.js"></script>
<form action = "action" method = "get" defaultbutton = "TriggerOnEnter">
<input type = "submit" id = "PreviousButton" name = "prev" value = "Prev" class = "secondary_button" />
<input type = "submit" id='TriggerOnEnter' name = "next" value = "Next" class = "primary_button" />
</form>Другой простой вариант - поместить кнопку возврата после кнопки отправки в HTML-коде, но разместить ее слева, чтобы она отображалась на странице перед кнопкой отправки.
Для этого достаточно изменить порядок табуляции. Будь проще.
От https://html.spec.whatwg.org/multipage/forms.html#implicit-submission
A form element's default button is the first submit button in tree order whose form owner is that form element.
If the user agent supports letting the user submit a form implicitly (for example, on some platforms hitting the "enter" key while a text field is focused implicitly submits the form)...
Если следующий ввод будет type = "submit", а изменение предыдущего ввода на type = "button" должно дать желаемое поведение по умолчанию.
<form>
<input type = "text" name = "field1" /> <!-- put your cursor in this field and press Enter -->
<input type = "button" name = "prev" value = "Previous Page" /> <!-- This is the button that will submit -->
<input type = "submit" name = "next" value = "Next Page" /> <!-- But this is the button that I WANT to submit -->
</form>
С помощью JavaScript (здесь jQuery) вы можете отключить кнопку prev перед отправкой формы.
$('form').on('keypress', function(event) {
if (event.which == 13) {
$('input[name = "prev"]').prop('type', 'button');
}
});
В первый раз, когда я столкнулся с этим, я придумал хак onclick () / JavaScript, когда варианты выбора не предшествуют / следуют, что мне до сих пор нравится из-за его простоты. Это выглядит так:
@model myApp.Models.myModel
<script type = "text/javascript">
function doOperation(op) {
document.getElementById("OperationId").innerText = op;
// you could also use Ajax to reference the element.
}
</script>
<form>
<input type = "text" id = "TextFieldId" name = "TextField" value = "" />
<input type = "hidden" id = "OperationId" name = "Operation" value = "" />
<input type = "submit" name = "write" value = "Write" onclick='doOperation("Write")'/>
<input type = "submit" name = "read" value = "Read" onclick='doOperation("Read")'/>
</form>
При нажатии любой кнопки отправки желаемая операция сохраняется в скрытом поле (которое является строковым полем, включенным в модель, с которой связана форма) и отправляет форму контроллеру, который принимает все решения. В контроллере вы просто пишете:
// Do operation according to which submit button was clicked
// based on the contents of the hidden Operation field.
if (myModel.Operation == "Read")
{
// Do read logic
}
else if (myModel.Operation == "Write")
{
// Do write logic
}
else
{
// Do error logic
}
Вы также можете немного усилить это, используя числовые коды операций, чтобы избежать синтаксического анализа строк, но если вы не играете с перечислениями, код будет менее читабельным, изменяемым и самодокументируемым, а анализ в любом случае тривиален.
Если вы внимательно прочитали вопрос, там не упоминается о «нажатии» кнопки отправки, все сводится к нажатию Enter в текстовом поле и определению, какая кнопка активируется. Код, который вы предоставляете, предназначен для другой проблемы, для которой уже есть несколько хороших решений, хотя ваше тоже хорошее. У вас есть решение исходного вопроса?
Я столкнулся с этим вопросом, когда пытался найти ответ на одно и то же, только с элементами управления ASP.NET, когда выяснил, что кнопка ASP имеет свойство UseSubmitBehavior, которое позволяет вам установить, какой из них отправляет.
<asp:Button runat = "server" ID = "SumbitButton" UseSubmitBehavior = "False" Text = "Submit" />
На всякий случай кто-то ищет способ сделать это с помощью кнопки ASP.NET.
Попробуй это..!
<form>
<input type = "text" name = "Name" />
<!-- Enter the value -->
<input type = "button" name = "prev" value = "Previous Page" />
<!-- This is the button that will submit -->
<input type = "submit" name = "next" value = "Next Page" />
<!-- But this is the button that I WANT to submit -->
</form>Предлагаемое вами решение сделает невозможным использование кнопки first / prev, поскольку она не отправит форму. По крайней мере, без помощи дополнительного кода Javascript.
Я решил очень похожую проблему таким образом:
Если JavaScript включен (в большинстве случаев в настоящее время), тогда все кнопки отправки имеют вид «деградированный» для кнопок при загрузке страницы через JavaScript (jQuery). События нажатия на кнопку «деградированный», введенные кнопками, также обрабатываются с помощью JavaScript.
Если JavaScript не включен, форма отображается в браузере с несколькими кнопками отправки. В этом случае нажатие Enter на textfield в форме отправит форму с первой кнопкой вместо предполагаемого дефолт, но, по крайней мере, форма все еще пригодна для использования: вы можете отправить с помощью кнопок предыдущий и следующий.
Рабочий пример:
<html>
<head>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
<form action = "http://httpbin.org/post" method = "post">
If JavaScript is disabled, then you CAN submit the form
with button1, button2 or button3.
If you press enter on a text field, then the form is
submitted with the first submit button.
If JavaScript is enabled, then the submit typed buttons
without the 'defaultSubmitButton' style are converted
to button typed buttons.
If you press Enter on a text field, then the form is
submitted with the only submit button
(the one with class defaultSubmitButton)
If you click on any other button in the form, then the
form is submitted with that button's value.
<br />
<input type = "text" name = "text1" ></input>
<button type = "submit" name = "action" value = "button1" >button 1</button>
<br />
<input type = "text" name = "text2" ></input>
<button type = "submit" name = "action" value = "button2" >button 2</button>
<br />
<input type = "text" name = "text3" ></input>
<button class = "defaultSubmitButton" type = "submit" name = "action" value = "button3" >default button</button>
</form>
<script>
$(document).ready(function(){
/* Change submit typed buttons without the 'defaultSubmitButton'
style to button typed buttons */
$('form button[type=submit]').not('.defaultSubmitButton').each(function(){
$(this).attr('type', 'button');
});
/* Clicking on button typed buttons results in:
1. Setting the form's submit button's value to
the clicked button's value,
2. Clicking on the form's submit button */
$('form button[type=button]').click(function( event ){
var form = event.target.closest('form');
var submit = $("button[type='submit']",form).first();
submit.val(event.target.value);
submit.click();
});
});
</script>
</body>
</html>Вы можете использовать Tabindex для решения этой проблемы. Также изменение порядка кнопок было бы более эффективным способом добиться этого.
Измените порядок кнопок и добавьте значения float, чтобы назначить им желаемое положение, которое вы хотите отображать в представлении HTML.
Вместо того, чтобы бороться с несколькими отправками, JavaScript или чем-то подобным для выполнения некоторых предыдущих / следующих вещей, альтернативой может быть использование карусели для имитации разных страниц. Делая это :
input type = "submit" в одном form.Пример использования Bootstrap 5.0.0:
<div id = "carousel" class = "carousel slide" data-ride = "carousel">
<form action = "index.php" method = "post" class = "carousel-inner">
<div class = "carousel-item active">
<input type = "text" name = "lastname" placeholder = "Lastname"/>
</div>
<div class = "carousel-item">
<input type = "text" name = "firstname" placeholder = "Firstname"/>
</div>
<div class = "carousel-item">
<input type = "submit" name = "submit" value = "Submit"/>
</div>
</form>
<a class = "btn-secondary" href = "#carousel" role = "button" data-slide = "prev">Previous page</a>
<a class = "btn-primary" href = "#carousel" role = "button" data-slide = "next">Next page</a>
</div>
Когда кнопка нажата мышью (и, надеюсь, прикосновением), она записывает координаты X, Y. Это не тот случай, когда он вызывается формой, эти значения обычно равны нулю.
Итак, вы можете сделать что-то подобное.
function(e) {
const isArtificial = e.screenX === 0 && e.screenY === 0
&& e.x === 0 && e.y === 0
&& e.clientX === 0 && e.clientY === 0;
if (isArtificial) {
return; // DO NOTHING
} else {
// OPTIONAL: Don't submit the form when clicked
// e.preventDefault();
// e.stopPropagation();
}
// ...Natural code goes here
}
Кажется, вы перепутали ввод нескольких кнопок с вводом одного изображения.
Не совсем, ожидается, что e будет MouseEvent. Посмотрите на свойства (developer.mozilla.org/en-US/docs/Web/API/MouseEvent).
Если кнопка была нажата с помощью мыши, isArtificial будет ложным. Потому что такие свойства, как clientX или clientY, будут не нулевыми, а координатами мыши.
Я думаю, что это лучшее решение для этого. Сделайте предыдущую кнопку с type до button и добавьте новый атрибут onclick в кнопку со значением jQuery(this).attr('type','submit');.
Итак, когда пользователь нажимает кнопку «Назад», его type будет изменен на submit, и форма будет отправлена с кнопкой «Назад».
<form>
<!-- Put your cursor in this field and press Enter -->
<input type = "text" name = "field1" />
<!-- This is the button that will submit -->
<input type = "button" onclick = "jQuery(this).attr('type','submit');" name = "prev" value = "Previous Page" />
<!-- But this is the button that I WANT to submit -->
<input type = "submit" name = "next" value = "Next Page" />
</form>
Просто используйте для float: left