【问题标题】:Form onsubmit versus submit button onclick表单 onsubmit 与提交按钮 onclick
【发布时间】:2011-08-02 06:40:39
【问题描述】:

更新 来自@BrendanEich

@mplungjan onclick 提交只是不属于按钮;提交表单显然更好。


使用提交按钮的 onclick 来确定是否应该提交表单的原因是什么?

我坚信

  1. 在提交前执行某些操作并在出错时取消提交,表单的 onsubmit 事件是放置它的明显位置
  2. 如果您使用提交按钮的 onclick 后决定使用 type="image",则事件处理程序将在许多浏览器中失败
  3. 如果您将提交更改为按钮,您还必须将提交添加到 onclick 事件处理程序。

我正在寻找强有力的理由来更喜欢使用提交按钮的 onclick 事件而不是表单的 onsubmit。

更新:请注意,我个人非常了解有关表单提交和验证的许多问题。

例如通过javascript提交不会触发onsubmit http://jsfiddle.net/mplungjan/3A4Ha/

<form onsubmit="alert('onSubmit called')">
    <input type="text" value="This will submit on enter but in IE the onclick is not triggered" style="width:100%"/><br/>
    <input type="submit" onclick="alert('Clicked')" />
</form><br />
<a href="#" onclick="alert('Submitting by script'); return false">Submit by script will not trigger onsubmit</a>

如果你在我的小提琴中按回车键,IE 也不会触发 onclick


历史:

在这里讨论

html button not clickable without being disabled

我非常不喜欢使用提交按钮的 onclick 来处理任何事情,因为 很多1 年看到这在许多浏览器中不起作用,主要是较旧的IE版本。 我列出了一些明显的原因,但我相信他们不会说服顽固的用户。

SO 的社区可以帮我把它钉在墙上,就像他们钉 w3schools 一样吗? 也请随时向 cmets 提供我如何以可接受的方式表达这个问题。


1:从 NS2.x 和 IE3.02 开始

【问题讨论】:

  • 看起来更像是一个讨论而不是一个问题......小心!哦,我同意使用提交事件。 :-)
  • 我同意使用表单的 onsubmit - 这也包括您通过输入键而不是提交按钮提交。
  • 不,保罗,它不是重复的。我知道区别。我正在寻找关于根本不使用 onclick 的好论据。
  • 感谢您的提琴

标签: javascript onclick onsubmit


【解决方案1】:

Form onsubmit 是一种更正确的方法,原因很简单,表单也可以使用&lt;ENTER&gt; 键提交,而不仅仅是单击提交按钮。

【讨论】:

  • 那也是 :) 但我倾向于举一个更实际的例子。好电话。
  • 只是为了完整起见,为了将来的访问者。 :) 但是,是的,您涵盖了 99% 的用例,这就是为什么我只是评论您的答案而不是添加我自己的答案。
  • @Paddy:使用脚本提交是一种特殊情况,因为它绕过了 onsubmit 处理程序 - 请参阅更新
  • @Rikudo - 不是原因。如果有一个提交按钮,当您在文本字段中按 enter 时会单击它 - 请参阅我的更新中的小提琴
  • @mplungjan 去图。今天学到了新东西。 :)
【解决方案2】:

没有直接的理由使用 from 的 onsubmit 处理程序而不是按钮的 onclick 处理程序。应该根据他们的意图使用命名事件。

您可以考虑具有两个动作的场景——“发送”动作(如“发送电子邮件”)和“保存”(如“草稿”)。前一个动作假定表单以连贯的方式填写,而后一个动作应该允许用户保持用户喜欢的任何状态。这使得点击处理程序成为决定验证和取消的理想场所。在这种情况下提交事件的相关性是不确定的。

为了使事情变得更加复杂,您可以在场景中添加自动保存和乐观并发。

恕我直言,多年的尝试和错误导致 HTML5 标准裁定该问题支持按钮元素。请参阅按钮的 [form*] 属性,该属性允许单独更改每个按钮的表单操作和方法。

【讨论】:

  • 表单属性是它对我有意义的唯一原因。我永远不会使用提交按钮的点击事件来提交表单。如果我需要多个按钮,我有 type="button" - 现在我可以考虑 form="" 但可能不会
  • 我同意类型按钮替代方案,但它不会使最终用户体验有所不同。它只是说明表单/控件模型在某种意义上是不完整的。不同的用户输入(鼠标、键盘)可能会导致相同的操作,而表单可能会有一些不同的操作。实际上,“提交”和“重置”是关于“点击”和“验证”的另一个维度的类别。