Подтвердить что ты не робот

Две кнопки отправки в одной форме

У меня есть две кнопки отправки в форме. Как определить, какой из них был затронут сервером?

4b9b3361

Ответ 1

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

<input type="submit" name="button_1" value="Click me">

Ответ 2

Вы можете дать каждому входу другое значение и сохранить одно и то же имя:

<input type="submit" name="action" value="Update" />
<input type="submit" name="action" value="Delete" />

Затем в коде проверьте, что было вызвано:

if ($_POST['action'] == 'Update') {
    //action for update here
} else if ($_POST['action'] == 'Delete') {
    //action for delete
} else {
    //invalid action!
}

Единственная проблема заключается в том, что вы привязываете свою логику к тексту внутри ввода. Вы также можете дать каждому уникальное имя и просто проверить $_POST за существование этого ввода:

<input type="submit" name="update_button" value="Update" />
<input type="submit" name="delete_button" value="Delete" />

И в коде:

if (isset($_POST['update_button'])) {
    //update action
} else if (isset($_POST['delete_button'])) {
    //delete action
} else {
    //no button pressed
}

Ответ 3

Еще лучшее решение состоит из использования тегов кнопок для отправки формы:

<form>
    ...
    <button type="submit" name="action" value="update">Update</button>
    <button type="submit" name="action" value="delete">Delete</button>
</form>

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

Ответ 4

Этот новый подход HTML5 к этому атрибуту formaction:

<button type="submit" formaction="/action_one">First action</button>
<button type="submit" formaction="/action_two">Second action</button>

По-видимому, это не работает в IE9 и ранее, но для других браузеров вам должно быть хорошо (см. w3schools.com HTML <button> formaction Attribute).

Лично я обычно использую Javascript для отправки форм удаленно (для более быстрой воспринимаемой обратной связи) с этим подходом в качестве резервного. Между ними единственными людьми, не охваченными, являются IE < 9 с отключенным Javascript.

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

Edit: Как отмечено Pascal_dher в комментариях, этот атрибут также доступен и в теге <input>.

Ответ 5

Это очень легко проверить

<form action="" method="get">

<input type="submit" name="sb" value="One">
<input type="submit" name="sb" value="Two">
<input type="submit" name="sb" value="Three">

</form>

Просто разместите это на странице HTML, нажмите кнопки и посмотрите URL

Ответ 6

<form>
    <input type="submit" value="Submit to a" formaction="/submit/a">
    <input type="submit" value="submit to b" formaction="/submit/b">    
</form>

Ответ 7

Возможно, предлагаемые решения здесь работали в 2009 году, но я тестировал все эти ответы, и никто не работает ни в каких браузерах.

только решение, которое я нашел, работает следующим образом: (но его немного уродливо использовать, я думаю)

<form method="post" name="form">
<input type="submit" value="dosomething" onclick="javascript: form.action='actionurl1';"/>
<input type="submit" value="dosomethingelse" onclick="javascript: form.action='actionurl2';"/>

Ответ 8

Используйте HTML-атрибут formaction (5-я строка):

<form action="/action_page.php" method="get">
    First name: <input type="text" name="fname"><br>
    Last name: <input type="text" name="lname"><br>
    <button type="submit">Submit</button><br>
    <button type="submit" formaction="/action_page2.php">Submit to another page</button>
</form>

Ответ 9

Лучший способ справиться с несколькими кнопками отправки - использование регистра переключателя в скрипте сервера.

<form action="demo_form.php" method="get">

Choose your favorite subject:

<button name="subject" type="submit" value="html">HTML</button>
<button name="subject" type="submit" value="css">CSS</button>
<button name="subject" type="submit" value="javascript">Java Script</button>
<button name="subject" type="submit" value="jquery">jQuery</button>

</form>

код сервера/серверный скрипт - где вы отправляете форму:

demo_form.php

<?php

switch($_REQUEST['subject']) {

    case 'html': //action for html here
                break;

    case 'css': //action for css here
                break;

    case 'javascript': //action for javascript here
                        break;

    case 'jquery': //action for jquery here
                    break;
}

?>

Источник: W3Schools.com

Ответ 10

RoBorg прав, но будьте осторожны - по крайней мере IE6 и Firefox3 ведут себя по-другому, когда вы нажимаете "Enter" для отправки вместо нажатия кнопки отправки. FF3, кажется, отправляет пару имя/значение первого входного ввода вместе с остальной частью формы, в то время как IE6 не отправляет ни один из входов отправки.

Ответ 11

Поскольку вы не указали, какой метод сценариев на стороне сервера вы используете, я приведу вам пример, который работает для Python, используя CherryPy (хотя он может быть полезен и для других контекстов):

<button type="submit" name="register">Create a new account</button>
<button type="submit" name="login">Log into your account</button>

Вместо того, чтобы использовать значение, чтобы определить, какая кнопка была нажата, вы можете использовать имя (с тегом <button> вместо <input>). Таким образом, если ваши кнопки имеют одинаковый текст, это не вызовет проблем. Имена всех элементов формы, включая кнопки, отправляются как часть URL-адреса. В CherryPy каждый из них является аргументом для метода, который выполняет код на стороне сервера. Итак, если ваш метод имеет **kwargs для списка параметров (вместо утомительного ввода каждого имени каждого элемента формы), вы можете проверить, какая кнопка была нажата следующим образом:

if "register" in kwargs:
    pass #Do the register code
elif "login" in kwargs:
    pass #Do the login code

Ответ 12

Определите name как array.

<form action='' method=POST>
    (...) some input fields (...)
    <input type=submit name=submit[save] value=Save>
    <input type=submit name=submit[delete] value=Delete>
</form>

Пример кода сервера (PHP):

if (isset($_POST["submit"])) {
    $sub = $_POST["submit"];

    if (isset($sub["save"])) {
        // save something;
    } elseif (isset($sub["delete"])) {
        // delete something
    }
}

elseif очень важно, потому что оба будут проанализированы, если нет. Наслаждайтесь.

Ответ 13

<form method="post">
<input type="hidden" name="id" value="'.$id.'" readonly="readonly"/>'; //any value to post PHP
<input type='submit' name='update' value='update' formAction='updateCars.php'/>
<input type='submit' name='delete' value='delete' formAction='sqlDelete.php'/>
</form>

Ответ 14

Я думаю, вы должны уметь читать имя/значение в вашем массиве GET. Я думаю, что кнопка, которая не была нажата, не появится в этом списке.

Ответ 15

Просто вы можете изменить действие формы на разных кнопках отправки. Нажмите.

Попробуйте это в документе. Готово

$(".acceptOffer").click(function () {
       $("form").attr("action", "/Managers/SubdomainTransactions");
});

$(".declineOffer").click(function () {
       $("form").attr("action", "/Sales/SubdomainTransactions");
});

Ответ 16

Вы также можете сделать это так (я думаю, это очень удобно, если у вас есть N входов).

<input type="submit" name="row[1]" value="something">
<input type="submit" name="row[2]" value="something">
<input type="submit" name="row[3]" value="something">

И затем на стороне сервера (PHP в моем примере) вы можете прочитать "row" в качестве массива для получения индекса:

$index = key($_POST['row']);

$_ POST ['row'] будет массивом только с одним элементом в виде index = > value (например: '2' = > 'something').

http://php.net/manual/en/function.key.php

Ответ 17

Вы также можете использовать атрибут href и отправить get со значением, добавленным для каждой кнопки. Но форма не требуется, тогда

href="/SubmitForm?action=delete"
href="/SubmitForm?action=save"

Ответ 18

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

<input type="submit" click="save()" name="saveBtn" value="save">
<input type="submit" click="update()" name="updateBtn" value="update">

Вам не нужно беспокоиться о том, какая кнопка вызывается на стороне сервера. Напишите свою логику в каждой функции отдельно и вызовите их. Они будут выполнять свою работу, не мешая другим.

Ответ 19

Вы можете представить следующие кнопки:

<input type="submit" name="typeBtn" value="BUY">
<input type="submit" name="typeBtn" value="SELL">

И затем в коде вы можете получить значение, используя:

if request.method == 'POST':
    #valUnits = request.POST.get('unitsInput','')
    #valPrice = request.POST.get('priceInput','')
    valType = request.POST.get('typeBtn','')

(valUnits и valPrice - некоторые другие значения, которые я извлекаю из формы, которую я оставил для иллюстрации)