У меня есть две кнопки отправки в форме. Как определить, какой из них был затронут сервером?
Две кнопки отправки в одной форме
Ответ 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').
Ответ 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 - некоторые другие значения, которые я извлекаю из формы, которую я оставил для иллюстрации)