Нажатие «Return» в HTML-форме с несколькими кнопками Submit - PullRequest
20 голосов
/ 20 января 2010

Давайте представим HTML-форму с двумя кнопками отправки.один из них расположен в верхней половине формы и выполняет что-то менее важное.другая кнопка - это кнопка фактической отправки, которая сохраняет введенные данные.эта кнопка расположена в конце формы.две кнопки будут запускать разные URL-адреса действий.

опытные пользователи предпочитают отправлять свои формы, нажимая «ввод» или «возврат» вместо нажатия соответствующей кнопки.

к сожалению, браузербудет искать первую кнопку отправки текущей формы и использовать ее для выполнения отправки формы.так как в моей форме вторая кнопка является действительной кнопкой отправки, мне нужно указать браузеру использовать эту конкретную кнопку (или URL-адрес действия, связанный с ней).

я не связываю javascriptслушатели, которые ищут нажатые клавиши или что-то в этом роде.поэтому я ищу лучший подход к этой проблеме.Тем не менее, приветствуются javascript или jquery-решения (без использования keypressed-listerner).

Большое спасибо за вашу помощь заранее.

Ответы [ 6 ]

19 голосов
/ 20 января 2010

измените первую кнопку на <input type="button" />.

8 голосов
/ 20 января 2010

Вы можете, по крайней мере теоретически, иметь в своей форме три кнопки submit.

Кнопка два - это существующая кнопка «менее важная» (от середины формы), кнопка три - это существующая кнопка «фактическая передача» из существующей формы.

Кнопка 1 должна быть скрыта (с использованием CSS display:none или visibility: hidden) и должна выполнять ту же функцию, что и ваша текущая проверка. Я думаю, что это все еще будет первая кнопка, найденная браузером, независимо от ее видимости.

<form method="post" method="whatever.php" enctype="form/multipart">

<fieldset id="first">

<label>...<input />
<label>...<input />
<label>...<input />

<input type="submit" value="submit" style="visibility: hidden;" <!-- or "display: none" --> />
<input class="less_important" type="submit" value="submit" />

</fieldset>

<fieldset id="second">

<label>...<input />
<label>...<input />
<label>...<input />

<input type="submit" value="submit" class="actual_submit" />

</fieldset>

</form>
<ч />

Отредактировано в ответ на комментарии:

Я думал, что скрытые кнопки также были отключены по умолчанию? [Md5sum]

Допустимое замечание, но я сделал ошибку, протестировав только в Firefox (3.5.7, Ubuntu 9.10) перед публикацией, в которой техника работала 1 , для обоих. Вставлен полный файл xhtml (ниже), который послужил основой моего тестирования после этих комментариев.

<?xml version="1.0" encoding="utf-8"?>
<!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>
    <title>3button form</title>
    <link rel="stylesheet" type="text/css" href="css/stylesheet.css" />
        <script type="text/javascript" src="js/jquery.js"></script>


        <script type="text/javascript">

$(document).ready(

    function() {

        $('input[type="submit"]').click(
            function(e){
                alert("button " + $(this).attr("name"));
            }
        );

    }
);
        </script>


</head>

<body>

<form method="post" method="whatever.php" enctype="form/multipart">

<fieldset id="first">

<label>...<input />
<label>...<input />
<label>...<input />

<input name="one" type="submit" value="submit" style="display:none;" /><!-- or "display: none" --> 
<input name="two" class="less_important" type="submit" value="submit" />

</fieldset>

<fieldset id="second">

<label>...<input />
<label>...<input />
<label>...<input />

<input name="three" type="submit" value="submit" class="actual_submit" />

</fieldset>

</form>


</body>

</html>

display: none должно препятствовать тому, чтобы кнопка была активной частью формы (включена в набор результатов и имеет право на значение по умолчанию для кнопки); visibility: hidden не должен. Однако оба этих случая ошибаются некоторыми браузерами. Обычный способ получить невидимую первую кнопку отправки - это position: absolute; и ее перемещение со страницы (например, с левой стороны: -4000px). Это некрасиво, но надежно. Также рекомендуется изменить его tabindex, чтобы он не влиял на ожидаемый порядок табуляции формы.

Есть, по крайней мере, два момента, которые я должен поднять к этому комментарию. В заказе:

  1. «Нормальный путь ...» Я не знал, что был нормальный путь, и представил этот вариант как возможность достичь цели, при полном понимании того, что было / есть почти наверняка множество лучших способов, особенно учитывая, что я не вижу веских причин для нескольких кнопок отправки в одной форме.
  2. Учитывая последнее предложение вышеупомянутого пункта, я хотел бы прояснить, что я не защищаю это. Совсем. Это выглядит как уродливый и несемантический взлом, когда у вас есть более одной кнопки отправки, при этом - в экземпляре ОП - одна кнопка, по-видимому, не является кнопкой отправки .
  3. Понятие "положение": абсолютное; left: -4000px; `мне пришло в голову, но это, похоже, произвело почти то же самое, что и` visibility: hidden; `, и у меня есть врожденная неприязнь к` position: absolute; `по любой причине ... поэтому я пошел с вариант, который был менее нежелателен для меня во время написания ... =)

Я ценю ваш комментарий по поводу tabindex, хотя я вообще об этом не думал.

Извините, если я выгляжу несколько странно, уже поздно, я устала ... йадда-йадда; С тех пор, как я вернулся домой, я тестировал разные браузеры, и кажется, что Firefox 3.5+ дает одинаковое поведение - «кнопка одна» в Windows XP и Ubuntu 9.10, все браузеры Webkit (Midori, Epiphany, Safari и Chrome) не работают. и сообщите «кнопку два».

Так что это определенно неудачная идея display: none; кнопка отправки. В то время как visibility:hidden по крайней мере работает.

<ч />
  1. Под этим я подразумеваю, что нажатие клавиши «enter» вызвало событие отправки формы или событие нажатия первой кнопки отправки формы, независимо от того, было ли это первое представление `display: none;` или ` видимость: скрыто`.

    Пожалуйста, имейте в виду, что мои навыки jQuery ограничены, поэтому использовались тесты (я запускал только один раз, чтобы попытаться предотвратить конфликты при выполнении, закомментировав тот, который я не запускал в то время, оба представлены - одно, явно закомментированное) вполне может быть недостаточным и нерепрезентативным.

3 голосов
/ 20 января 2010

Что делает первая кнопка? Если вам просто нужна кнопка для подключения слушателя js, который не отправляется, используйте

<button type="button" id="myButton">Text Here</button>
0 голосов
/ 06 января 2015

Еще один обходной путь - создать дополнительный нефункциональный вход для отправки в самом начале формы и скрыть его, используя непрозрачность:

<input type="submit" value="" onclick="return false;" style="opacity: 0">

Кнопка все равно будет отображаться на странице, хотя и прозрачной,так что вам придется предоставить немного недвижимости для него.В качестве альтернативы вы можете поиграть с перемещением его за другим элементом с помощью z-index или рендерингом за пределы страницы, как это уже предлагали другие.

Что вы получаете с onclick="return false;", так это то, что форма не будет отправлена ​​при нажатии«Войти» больше;перезагрузки страницы тоже нет.

0 голосов
/ 23 июня 2014
<script>
$(function(){
    $('#button-new-captcha').click(function(){
        $('input[name=button-submit]').prop('name', 'button-new-captcha').click();
    });
});
</script>

<div class="buttons">
    <a class="btn btn-cancel" href="/login">Cancel</a> 
    <a class="btn btn-default" href="#" id="button-new-captcha">New Image</a> 
    <input type="submit" name="button-submit" class="btn btn-default" value="Send Username">    
</div>
0 голосов
/ 20 января 2010

Можно ли использовать абсолютное позиционирование на вашей менее важной кнопке отправки, чтобы оно отображалось после основной кнопки отправки в HTML? Итак, вы можете иметь:

<form>
<p>
Stuff
<input type="submit" value="This is my main submit button" />
<input type="submit" value="This is my secondary submit button" style="position: absolute; left: 0px; top: 0px; />
</p>
</form>

Ваша дополнительная кнопка отправки появится первой на экране, но основная кнопка отправки должна иметь приоритет при нажатии Enter.

...