如果表单已提交但不是通过任何特定按钮提交,例如
- 按
Enter
- 在 JS 中使用
HTMLFormElement.submit()
浏览器应该如何确定多个提交按钮中的哪一个(如果有)用作按下的按钮?
这在两个层面上很重要:
- 调用附加到提交按钮的
onclick
事件处理程序 - 发送回网络服务器的数据
到目前为止,我的实验表明:
- 按下
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>
原文由 Stewart 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您通过 JavaScript 提交表单(即
formElement.submit()
或任何等效项),则 没有 一个提交按钮被认为是成功的,并且它们的值都不包含在提交的数据中。 (请注意,如果您使用submitElement.click()
提交表单,那么您引用的提交被认为是有效的;这并不真正属于您的问题范围,因为这里的提交按钮是明确的,但是我想我会为阅读第一部分并想知道如何通过 JavaScript 表单提交使提交按钮成功的人包括它。当然,表单的 onsubmit 处理程序仍然会以这种方式触发,而他们不会通过form.submit()
所以这是另一壶鱼……)如果表单是通过在非文本区域字段中按 Enter 提交的,那么实际上由用户代理来决定它想要什么。 规范 没有说明在文本输入字段中使用
Enter
键提交表单(如果您选择一个按钮并使用空格或其他方式激活它,那么没有问题,因为该特定提交按钮被明确使用)。它只是说激活提交按钮时必须提交表单。甚至不需要在例如文本输入中按 Enter
来提交表单。我相信 Internet Explorer 选择了源中最先出现的提交按钮;我有一种感觉,Firefox 和 Opera 选择具有最低 tabindex 的按钮,如果没有定义其他内容,则回退到第一个定义的按钮。关于提交是否具有非默认值属性 IIRC 也存在一些复杂性。
要带走的一点是,这里发生的事情没有定义的标准,这完全是浏览器的心血来潮 - 所以无论你在做什么,尽量避免依赖任何特定的行为。如果您真的必须知道,您可能会发现各种浏览器版本的行为,但是当我不久前对此进行调查时,有一些非常复杂的情况(当然会随着新的浏览器版本而改变),我会建议您尽可能避免!