23

我有一个问题,在 IE8 中输入无法提交表单。我已经生成了一个测试页面来暴露这个问题。似乎在onLoad函数中显示表单会禁用enter按钮不再触发提交的结果。这是 IE8 中的错误还是一些安全问题?

重现此的代码是:

onload = function() { 
    document.getElementById('test').style.display = 'block'; 
} 
#test {
    display: none;
}
<form id="test" method="get" action="javascript:alert('woei!')"> 
    <input type="text" name="user" value=""> 
    <input type="password" name="pw" value="">
    <input type="submit" value="submit" id="submit"> 
</form> 

4

14 回答 14

13

我找到了一个合适的解决方案,并希望与你们分享。

而不是使用<input type="submit...>,使用<button type="submit"...>。这将在其他浏览器(IE6-7、FF3)中完全相同,并且在 IE8 中有效。:)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<head> 
<style type="text/css">
#test {
    display: none;
} 
</style> 
<script type="text/javascript"> 
onload = function() { 
    document.getElementById('test').style.display = 'block'; 
};
</script> 
</head> 
<body> 
<form id="test" method="get" action="javascript:alert('woei!')"> 
    <input type="text" name="user" value="" /> 
    <input type="password" name="pw" value="" />
    <button type="submit" value="submit" id="submit"></button>
</form> 
</body> 
</html>
于 2009-09-16T15:14:25.470 回答
9
$("form input").keypress(function (e) {
   if(e.which === 13) {
      $("form").submit();
   }
});

上面是一个适当的修复。参考:IE 没有在按回车键时提交我的表单?

于 2013-02-15T09:29:52.410 回答
6

我认为一切都比你想象的要复杂得多......

当表单的显示值使用 css 类设置为 none 或仅在页面初始时使用样式属性时,仅当您有多个具有文本类型的输入字段时,在文本字段中按 enter 键不起作用...如果您有一个文本字段,它可以正常工作.. 如果您有多个,它不会触发表单提交...

在这里我做了一个演示...

工作正常(正常形式) http://yasinergul.com/stackoverflow/ie8-enter-key-bug/one.html

工作正常(表格隐藏和设置可见,但它是一个文本输入) http://yasinergul.com/stackoverflow/ie8-enter-key-bug/two.html

不起作用(表单隐藏和设置可见,但它有两个文本输入) http://yasinergul.com/stackoverflow/ie8-enter-key-bug/three.html

我认为最好的方法是给对象一个 .hidden 类,但不为这个 css 选择器设置 display:none 。你可以用jquery让它隐藏起来

$(".hidden").hide();

当页面加载时,表单会显示几毫秒,但在 jquery 工作后被隐藏......

于 2010-02-22T23:46:58.367 回答
4

我不能确切地说这是否是一个错误,但我可以确认您报告的行为在 IE 8 中发生了变化……我想这可能是一个错误,而不是故意的改变。

如果表单使用 CSS display:none 设置,则默认提交按钮行为不起作用。

其他浏览器,包括 IE 7(甚至是使用 IE 7 标准兼容模式的 IE 8)都没有问题。

我自己通过使用 height:0px; 解决了这个问题。在 CSS 中,然后在我想显示表单时让 javascript 设置适当的高度。改用高度,默认的输入键提交行为似乎正常工作。

于 2009-09-15T16:08:21.877 回答
1

旧票,但我想补充一下我认为的解释:

IE8 做了以下特殊的事情:Enter 键将提交表单,但任何

<input type="submit" name="MySubmitButton" value="I hope I detect THIS VALUE in POST" />

不会在 POST 中发送。

IE9 改变行为并发送值。据我的测试显示,Chrome 一直发送值。

我希望这有帮助...

于 2012-09-24T10:00:10.213 回答
1

对于任何偶然发现此问题的未来用户:

对我有用的是添加一个 DOCTYPE:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

于 2013-11-05T20:53:00.720 回答
1

修复了@Jitendra Pancholi 的建议——现在它只提交我们想要的表单,而不是所有表单

$("form input").keypress(function (e) {
   if(e.which === 13) {
      $(this.form).submit();
   }
});
于 2015-01-09T14:49:11.157 回答
0

我在 IE8 中尝试过,它对我有用。不过,您必须确保表单的该部分具有焦点。

Javascript 有一个焦点函数,如果你需要,你可以使用它来设置焦点。

var textbox = document.getElementById("whatever name input box's id will be");
if(textbox) textbox.focus();
于 2009-09-15T15:52:31.440 回答
0

您可能想在输入框中添加一个 onkeyup 事件,这样如果您在输入框中按回车键,它也会提交。

正如 CodePartizan 所提到的,否则您需要将焦点放在按钮上,因此如果您切换到按钮或单击它,它似乎也对我有用。

于 2009-09-15T16:02:52.807 回答
0

我相信亚辛已经明白了。我只是遇到了同样的问题:表单中的多个文本字段的可见性是“隐藏的”。我的解决方法(防止表单闪烁)是在 css 中将表单不透明度设置为 0,然后在文档就绪时使用 jQuery 自定义其样式设置。

我相信这不是 JS 可以解决的问题。

于 2010-03-01T11:23:20.280 回答
0

是的,我今天也被这个虫子咬了。不过,我发现了这个解决方法(与 OP 不同):

 <script type="text/javascript"> 
 onload = function() { 
     document.getElementById('test').style.display = 'block'; 
+    document.getElementById('test').innerHTML =
+        document.getElementById('test').innerHTML;
 } 
 </script> 
 </head>

只需从表单本身的内容重新创建表单的内容。哎呀。但它有效。(著名遗言...)

于 2010-12-20T19:15:48.040 回答
0

这适用于我在 IE8 中。仅使用一个输入字段时我遇到了这个问题。

阅读更多:http ://www.rachaelarnold.com/dev/archive/enter-key-form-submission-bug#ixzz2Y5Zwgj2k

于 2013-07-04T15:01:30.513 回答
0

我对 ie 也有同样的问题,在我读到这篇文章之前,没有任何解决方案有帮助:

http://www.rachaelarnold.com/dev/archive/enter-key-form-submission-bug#ixzz2Y5Zwgj2k

我的表格只有一个输入字段……呃!:)

于 2014-08-26T20:30:57.137 回答
0

找到了一个可行的解决方案。

使提交按钮不可见,而不是使用 display:none;

input#submit {
color: transparent;
background: transparent;
border: 0px;
}
于 2015-02-02T18:54:53.047 回答