一尘不染

如何确定HTML表单上的默认提交按钮?

javascript

如果提交表单但未通过任何特定按钮提交,例如

  • 通过按 Enter
  • HTMLFormElement.submit()在JS中使用

浏览器应如何确定按下多个提交按钮(如果有)中的哪个?

这在两个层面上都很重要:

  • 调用onclick附加到提交按钮的事件处理程序
  • 数据发送回Web服务器

到目前为止,我的实验表明:

  • 按下时Enter,Firefox,Opera和Safari使用表单中的第一个提交按钮
  • 按下时Enter,IE会使用第一个“提交”按钮,或者根本不使用任何按钮,这取决于我无法弄清楚的情况
  • 所有这些浏览器完全不使用JS提交

标准怎么说?

如果有帮助,这是我的测试代码(PHP仅与我的测试方法有关,与我的问题本身无关)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>

<body>

<h1>Get</h1>
<dl>
<?php foreach ($_GET as $k => $v) echo "<dt>$k</dt><dd>$v</dd>"; ?>
</dl>

<h1>Post</h1>
<dl>
<?php foreach ($_POST as $k => $v) echo "<dt>$k</dt><dd>$v</dd>"; ?>
</dl>

<form name="theForm" method="<?php echo isset($_GET['method']) ? $_GET['method'] : 'get'; ?>" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
    <input type="text" name="method" />
    <input type="submit" name="action" value="Button 1" onclick="alert('Button 1'); return true" />
    <input type="text" name="stuff" />
    <input type="submit" name="action" value="Button 2" onclick="alert('Button 2'); return true" />
    <input type="button" value="submit" onclick="document.theForm.submit();" />
</form>

</body></html>

阅读 347

收藏
2020-05-01

共1个答案

一尘不染

如果您通过Javascript(即提交表单formElement.submit()或任何等价物),然后
的提交按钮被认为是成功的,没有它们的值都包含在提交的数据。(请注意,如果您使用提交表单,submitElement.click()那么您所引用的提交就被认为是活动的;这并没有真正落到您的问题的范围之内,因为此处的提交按钮是明确的,但我想我应该将其包括在内对于那些阅读了第一部分的人,并且想知道如何通过JS表单提交成功地完成一个提交按钮。当然,表单的onsubmit处理程序仍然会以这种方式触发,而他们不会通过,form.submit()因此这是另一回事了……)

如果在非textarea字段中通过按Enter提交表单,则实际上取决于用户代理在此处确定所需内容。该规范不说有关使用输入在文本输入字段键的同时提交表单什么(如果你标签的按钮,使用空间或任何激活它,然后还有为特定的提交按钮是没有问题的明确使用)。它只说要激活一个提交按钮就必须提交一个表单,甚至不需要输入例如文本输入就可以提交该表单。

我相信InternetExplorer会选择源中最先出现的“提交”按钮;我觉得Firefox和Opera选择的TabIndex最低的按钮,如果没有其他定义,则会退回到第一个定义的按钮。关于提交者是否具有非默认值属性IIRC,还存在一些复杂问题。

要解决的问题是,这里没有定义明确的标准,这完全取决于浏览器的想法-
因此,无论您在做什么,都应尽可能避免依赖任何特定的行为。如果您真的必须知道,您可能可以找出各种浏览器版本的行为,但是当我前一段时间进行调查时,存在一些相当复杂的条件(当然,这些条件可能会随新的浏览器版本而改变),我建议您尽可能避免它!

2020-05-01