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