我在一个表单中有两个提交按钮。我如何确定哪一个击中了服务器端?
当前回答
将name定义为数组。
<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非常重要,因为两者都将被解析。
其他回答
需要注意的是,如果您有多个提交按钮,并且您按了return (ENTER键),那么键盘上的默认按钮值将是DOM上的第一个按钮。
例子:
<form>
<input type="text" name="foo" value="bar">
<button type="submit" name="operation" value="val-1">Operation #1</button>
<button type="submit" name="operation" value="val-2">Operation #2</button>
</form>
如果你在这个表单上按ENTER键,将发送以下参数:
foo=bar&operation=val-1
将name定义为数组。
<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非常重要,因为两者都将被解析。
这里有一个新的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>标记上也可用。
因为你没有指定你使用的服务器端脚本方法,我将给你一个适用于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
更新后的答案是使用带有formaction和formtarget的按钮
在本例中,第一个按钮在新选项卡中启动了一个不同的url /预览。其他三个使用表单标记中指定的操作。
<button type='submit' class='large' id='btnpreview' name='btnsubmit' value='Preview' formaction='/preview' formtarget='blank' >Preview</button>
<button type='submit' class='large' id='btnsave' name='btnsubmit' value='Save' >Save</button>
<button type='submit' class='large' id='btnreset' name='btnsubmit' value='Reset' >Reset</button>
<button type='submit' class='large' id='btncancel' name='btnsubmit' value='Cancel' >Cancel</button>
完整的文档在这里
推荐文章
- 使伸缩项目正确浮动
- 形式内联内的形式水平在twitter bootstrap?
- 自定义元素在HTML5中有效吗?
- 如何触发自动填充在谷歌Chrome?
- 创建圈div比使用图像更容易的方法?
- 为什么Chrome浏览器不正确地确定页面是在不同的语言,并提供翻译?
- 在网页上用鼠标模拟震颤(例如帕金森病)?
- Bootstrap抛出Uncaught错误:Bootstrap的JavaScript需要jQuery
- 如何改变文本区域的边框颜色:焦点
- 我如何设置背景颜色为文本的宽度,而不是整个元素的宽度,使用CSS?
- 如何删除和清除所有的本地存储数据
- 强制打开“另存为…”弹出打开文本链接点击PDF在HTML
- 如何修改标签文本?
- 在HTML中还有其他有用的空格码吗,比如半空格的 , em-spaces, en-spaces等等?
- 输入触发器按钮单击