前几天遇到了这个问题。我忘了在哪里,但我把它记在我的小笔记本上了,准备写成博客文章。我把它写下来是因为我听到的处理方式太复杂了。
假设您有一个这样的表单
<form action="/submit">
<!-- inputs and stuff -->
<input type="submit" value="Submit">
</form>
提交该表单时,它将转到 URL `/submit`。假设您需要另一个提交按钮,该按钮提交到不同的 URL。为什么并不重要。总是会有原因的。互联网是一个很大的地方,等等。
我在网上搜索了人们处理这个问题的其他方法。
一种方法是放弃提交到不同的 URL,而是为每个提交按钮提供一个共享的 name,但使用不同的 value,然后在处理时检查该值以执行不同的操作。
<input type="submit" name="action" value="Value-1">
<input type="submit" name="action" value="Value-2">
您可以在处理过程中读取该值,并在需要时进行重定向。但这只是对所述问题的解决方法。
另一种方法是使用 JavaScript 在点击按钮时更改 <form> 的操作。有很多方法可以做到这一点,但归根结底是
<form name="form">
<!-- inputs and stuff -->
<input type="submit" onclick="javascript: form.action='/submit';">
<input type="submit" onclick="javascript: form.action='/submit-2';">
</form>
这当然依赖于 JavaScript,这并不是什么大问题,但与它本可以实现的渐进增强友好性并不一致。
正确答案(如果我可以这么大胆地说)是 HTML 已经为您解决了这个问题。也许它不像它应该的那样广为人知。所以才有了这篇文章,我想。
这一切都与 formaction 属性有关,您可以将其直接放在提交按钮上,它会覆盖表单本身的 action。
<form action="/submit">
<input type="submit" value="Submit">
<input type="submit" value="Go Elsewhere" formaction="/elsewhere">
</form>
就这样。继续。
好技巧,感谢分享!
可能值得一提的是,此属性在 IE9 及以下版本中不受支持。
https://caniuse.cn/#feat=form-submit-attributes
IE9 及以下版本到底支持什么?
表格
不错!我不知道
formaction。它似乎在所有浏览器中都得到了很好的支持,一直追溯到 IE 10。感谢发布,Chris!另一个值得了解的不太常用的属性。
根据我在网上找到的浏览器支持信息,它在 IE9 中不起作用。IE10 及更高版本将支持它。它在 Chrome、Opera 和 Firefox 中已经存在了一段时间,在 Safari 中则从 5.1 开始支持。
太棒了!我在 HTML 5 中完全错过了这一点。期待用它来替换我们方法 1 的表单。谢谢!
哇!几周前我试图解决这个问题,最后做了其他事情(记不清是怎么做的了)。
这个解决方案看起来很棒。
谢谢。
也许我需要更多地思考这个问题,但我无法想象一个需要两个提交按钮的表单。您正在向服务器回发,让服务器根据接收到的信息来决定要做什么……对吗?
勾选一个“仅支付定金”的复选框,然后提交,比撤销点击“支付全额”按钮(然后感叹号和脏话)要容易得多。
人们真的很聪明,测试这一假设的最简单方法是在页面上放置两个提交按钮。
只是我的两分钱!
肯定有理由……也许您有一个金融投资组合网站。一个按钮生成包含您选择的股票代码的 CSV 文件,一个按钮导出到 Excel,还有一个按钮创建图表。在这三种情况下,执行工作的代码将执行截然不同的操作。虽然您可以将这些操作合并到一个地方,但您可能要处理一些约束条件,例如不想拆分 Excel 导出插件以将其合并到图表制作插件中。
或者,您可能需要跟踪每个操作作为一个单独的页面浏览量,而您的 SEO 专家希望为这些元素保留特定的 URL……并且您无法使用 Google Analytics,因为它适用于中国市场,或者因为您设置了要求跟踪最终 URL 的业务规则等等。
有很多理由以非传统的方式做事。
我想我们必须同意不同意。
虽然我理解提供 UI 元素来实现某些功能的重要性,但我仍然认为它们不应该属于同一个表单。例如,要生成一个 CSV/Excel 文件,我会使用一个 “a” 标签,该标签指向一个生成要下载的文件的页面(我们现在一直这样做)……不需要回发/提交。需要一个按钮来创建图表——我们使用 JS 从另一个页面(服务器端代码从表中提取数据)获取 JSON feed……不需要回发/提交。
使用上述方法还可以获得 SEO/唯一 URL 的额外好处。
重申我的观点,是的,我不会争辩说您需要各种 UI 组件来实现某些结果,但具体来说,将多个提交按钮作为同一个表单的一部分不是一个好主意……IMO。
这……出乎意料地有用。
我刚检查了一下,是的,还有一个
formmethod属性。太棒了!以前不知道,谢谢!
感谢您的提示!
非常有用!我最想念的是标记一个提交按钮作为默认按钮。现在由浏览器决定。您可以使用
:default来标记默认按钮,但无法更改默认值。它可能是第一个,但我认为它没有规范,而且仍然无法更改 =( 所以多个按钮总是很危险。让我想起了把一些乐高积木拼凑起来做某件事,结果 6 个月后在盒子的最底部找到了一个专为此任务而设计的积木!
我对这个听起来很不错的代码提示的直接想法是,在用于通过联系表单发送消息的表单上……每个部门都有一个提交按钮,不需要下拉列表或复选框。