我在一个表单中有两个提交按钮。我如何确定哪一个击中了服务器端?
当前回答
一个HTML示例,在不同的按钮点击发送不同的表单动作:
<form action="/login" method="POST">
<input type="text" name="username" value="your_username" />
<input type="password" name="password" value="your_password" />
<button type="submit">Login</button>
<button type="submit" formaction="/users" formmethod="POST">Add User</button>
</form>
使用相同的表单添加新用户和登录用户。
其他回答
解决方案1: 给每个输入一个不同的值,并保持相同的名称:
<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!
}
这样做的问题是,您将逻辑绑定到输入中的用户可见文本。
解决方案2: 给每个对象一个唯一的名称,并检查$_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
}
我认为您应该能够读取GET数组中的名称/值。我认为没有点击的按钮不会出现在列表中。
也许这里建议的解决方案在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';"/>
</form>
这里有一个新的HTML5方法,formaction属性:
<button type="submit" formaction="/action_one">First action</button>
<button type="submit" formaction="/action_two">Second action</button>
显然,这在Internet Explorer 9和更早的版本中不起作用,但对于其他浏览器应该没问题(参见:w3schools.com HTML <button> formaction Attribute)。
就我个人而言,我通常使用JavaScript远程提交表单(以获得更快的感知反馈),并使用这种方法作为备份。在这两者之间,唯一不涉及的是禁用JavaScript的ie9版本之前的Internet Explorer。
当然,如果不管按哪个按钮,基本上在服务器端执行相同的操作,这可能是不合适的,但通常情况下,如果有两个可用的用户端操作,那么它们也会映射到两个服务器端操作。
正如Pascal_dher在注释中指出的,这个属性在<input>标记上也可用。
<form>
<input type="submit" value="Submit to a" formaction="/submit/a">
<input type="submit" value="submit to b" formaction="/submit/b">
</form>