两种提交button的一种forms

我有一个表单中的两个提交button。 我如何确定哪一个被命中serverside?

如果你给每个人一个名字,被点击的人将被作为任何其他input发送。

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

您可以给每个input一个不同的值,并保持相同的名称:

 <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! } 

唯一的问题是你将你的逻辑与input内的文本联系起来。 你也可以给每个人一个独特的名字,只需检查$ _POST是否存在该input:

 <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 } 

更好的解决scheme包括使用button标签来提交表单:

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

这样国际化和多种显示语言(在前一种解决scheme中,button的标签也是发送给服务器的值)没有不便。

有一个新的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来远程提交表单(用于更快地察觉到反馈),以此方法作为备份。 在这两者之间,唯一没有涉及的人是禁用JavaScript的IE <9。

当然,如果你基本上是采取同样的动作服务器端,不pipe按哪个button,但通常如果有两个用户端操作可用,那么它们也将映射到两个服务器端操作。

编辑:正如注释中的Pascal_dher所指出的,这个属性也可以在<input>标签中使用。

这非常容易testing

 <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页面中,点击button,然后看看URL

也许build议的解决scheme在这里工作在2009年,但我testing了所有这些upvoted的答案,没有人在任何浏览器工作。

只有解决scheme,我发现工作是这样的:(但它有点难看,我认为)

 <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';"/> 
 <form> <input type="submit" value="Submit to a" formaction="/submit/a"> <input type="submit" value="submit to b" formaction="/submit/b"> </form> 

处理多个提交button的最好方法是在服务器脚本中使用切换大小写

 <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

RoBorg是对的,但要小心一些东西 – 至lessIE6和Firefox3在按Enter键提交而不是点击一个提交button时会有不同的performance。 FF3似乎将第一个提交input的名称/值对与表单的其余部分一起发送,而IE6不发送任何提交input。

既然你没有指定你正在使用的服务器端脚本方法,我会给你一个适用于Python的例子,使用CherryPy(尽pipe它也可能对其他上下文有用):

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

您可以使用名称(使用<button>标记而不是<input> )来代替使​​用该值来确定按下哪个button。 这样,如果你的button碰巧有相同的文字,它不会造成问题。 所有表单项(包括button)的名称都作为URL的一部分发送。 在CherryPy中,每一个都是服务器端代码的一个参数。 所以,如果你的方法只有**kwargs参数列表(而不是繁琐地input每个表单项的每个单一名称),那么你可以检查看看哪个button被按下这样:

 if "register" in kwargs: pass #Do the register code elif "login" in kwargs: pass #Do the login code 
 <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> 

我认为你应该能够读取你的GET数组中的名字/值。 我认为那个没有被点击的button不会出现在那个列表中。

array定义为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非常重要,因为如果不是,则两者都将被parsing。 请享用。

简单的你可以改变表单的动作在不同的提交button上单击。

在document.Ready中试试这个

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

你也可以这样做(如果你有N个input,我觉得这很方便)。

 <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),你可以读取“行”作为数组来获得索引:

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

$ _POST ['row']将是一个只有一个元素的数组,forms为index => value(例如:'2'=>'something')。

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

您也可以使用href属性,并为每个button附加一个值。 但是表格不会被要求

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

你可以像这样呈现button:

 <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是我从我留下的插图中提取的一些其他值)