为什么带有单个<form>
字段的<input>
会在用户输入值并按 Enter 时重新加载表单,如果有是<form>
中的2个或多个字段?
我写了simple page来测试这个奇怪的东西。
如果您在第二个表单中输入一个值并按Enter键,您将看到它重新加载传递输入值的页面,就像您调用了GET
一样。为什么?我该如何避免呢?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>testFormEnter</title>
</head>
<body>
<form>
<input type="text" name="partid2" id="partid2" />
<input type="text" name="partdesc" id="partdesc" />
</form>
<p>2 field form works fine</p>
<form>
<input type="text" name="partid" id="partid" />
</form>
<p>One field form reloads page when you press the Enter key why</p>
</body>
</html>
答案 0 :(得分:50)
这是一个鲜为人知的“Quirk”已经出现了一段时间。我知道有些人已经以各种方式解决了这个问题。
在我看来,最简单的绕过就是只有第二个输入不会显示给用户。虽然在后端并不是所有用户友好的,但它确实可以解决问题。
我应该注意到,我听到这个问题最常见的地方是IE专用而不是FireFox或其他。虽然它似乎也影响了它们。
答案 1 :(得分:48)
这是known bug in IE6/7/8。您似乎无法获得修复。
您可以为此做的最佳解决方法是添加另一个隐藏字段(如果您的工程良心允许)。当IE发现表单中有两个输入类型字段时,IE将不再自动提交表单。
<强>更新强>
如果你想知道为什么会这样,这个宝石直接来自HTML 2.0 specification (Section 8.2):
当表单中只有一个单行文本输入字段时, 用户代理应接受该字段中的Enter作为提交请求 形式。
答案 2 :(得分:7)
按Enter键的工作方式不同,具体取决于(a)有多少个字段,以及(b)有多少个提交按钮。它可能什么都不做,它可能会提交没有“成功”提交按钮的表单,或者它可能会假装点击第一个提交按钮(甚至为它生成onclick!)并使用该按钮的值提交。
例如,如果您在双字段表单中添加input type="submit"
,则会注意到它也会提交。
这是一个古老的浏览器怪癖至少可以追溯到早期的Netscape(可能更远),现在不太可能改变。
&LT;形式&GT;
没有'动作'无效。如果您不打算在任何地方提交,并且您不需要单选按钮名称分组,则可以完全省略表单元素。
答案 3 :(得分:7)
以下是我用来解决问题的代码:
<form>
<input type="text" name="partid" id="partid" />
<input type="text" name="StackOverflow1370021" value="Fix IE bug" style="{display:none}" />
</form>
答案 4 :(得分:5)
不,默认行为是在输入时,提交表单中的最后一个输入。 如果您根本不想提交,可以添加:
if(process.env.MONGODB_URI) {
mongoose.connect(process.env.MONGODB_URI, options);
} else {
// Connect to local database
}
或在您的输入中
<form onsubmit="return false;">
当然还有更漂亮的解决方案,但这些解决方案更简单,没有任何库或框架。
答案 5 :(得分:3)
它没有重新加载页面,它正在提交表单。
但是,在此示例中,因为表单上没有action属性,所以它提交给自己,这给人以重新加载页面的印象。
另外,我不能重复你描述的行为。如果我在表单中的任何文本输入中,我按Enter键提交表单,无论输入位于何处或输入有多少输入。
您可能希望在不同的浏览器中尝试更多。
答案 6 :(得分:2)
正如Vineet已经说过的,这源于html 2.0规范:
以下是如何在不搞砸网址的情况下防止这种情况发生:
<form>
<input type="text" name="partid" id="partid" />
<input type="text" style="display: none;" />
</form>
答案 7 :(得分:1)
感谢所有回答的人。令人大开眼界的是,具有单个字段的表单与具有许多字段的表单的行为不同。
处理此自动提交的另一种方法是编写返回false的提交函数。
在我的情况下,我有一个带onclick事件的按钮,所以我将带有return
关键字的函数调用移动到onsubmit事件。如果调用的函数返回false,则不会发生提交。
<form onsubmit="return ajaxMagic()">
<input type="text" name="partid" id="partid" />
<input type="submit" value="Find Part" />
</form
function ajaxMagic() {
...
return (false);
}
答案 8 :(得分:1)
我在所测试的所有浏览器(IE,FF,Chrome,Safari,Opera)中找到的解决方案是表单上的第一个输入type=submit
元素必须是可见的并且必须是第一个形式中的元素。我能够使用CSS放置将提交按钮移动到页面底部,它不会影响结果!
<form id="form" action="/">
<input type="submit" value="ensures-the-enter-key-submits-the-form"
style="width:1px;height:1px;position:fixed;bottom:1px;"/>
<div id="header" class="header"></div>
<div id="feedbackMessages" class="feedbackPanel"></div>
...... lots of other input tags, etc...
</form>
答案 9 :(得分:0)
IE和Chrome都会出现此问题。 它不会出现在Firefox上。 一个简单的解决方案是将以下属性添加到表单标记: onsubmit =&#34;返回false&#34;
当然,假设您使用XMLHttpRequest对象提交表单。
答案 10 :(得分:0)
是的,带有单个inputText字段的表单在HTML 4中的作用不同。
onSubmit return false不适合我,但下面的修复bug工作正常
<!--Fix IE6/7/8 and HTML 4 bug -->
<input style="display:none;" type="text" name="StackOverflow1370021" value="Fix IE bug" />
答案 11 :(得分:0)
我通过以下代码处理了这个问题,但我不确定这是否是一个好方法。 通过查找给定表单中的输入字段以及它的1是否阻止默认操作。
if($j("form#your-form input[type='text']").length == 1) {
$j(this).bind("keypress", function(event) {
if(event.which == 13) {
event.preventDefault();
}
});
}
答案 12 :(得分:-1)
我认为这是一个功能,但我也禁用了它。它没有花大力气去禁用它。只需捕获回车键,忽略它,即可。