我有一个与此类似的jQuery / HTML代码:
<form action="/SomeAction" method="post">
<input id="my-textbox" type="text" placeholder="Write something and press enter to continue..." />
</form>
<script type="text/javascript">
$(function() {
$('#my-textbox').keyup(function(e) {
var $textbox = $(this);
if ($textbox.val().length > 0 && e.keyCode == 13) {
$textbox.parent('form').submit();
}
});
});
</script>
目的是在用户按下“Enter”键时自动提交表单。我经常使用Firefox,所以在我使用谷歌浏览器和Internet Explorer进行测试之前,一切都还行。
当我在后面的浏览器中按下Enter键时,有时我会将表单提交两次。这很容易被注意到,因为我会在我的数据库中获得重复的条目,并且我会看到两个POST
使用Fiddler。
经过一些测试后,我发现我的问题是jQuery代码,因为文本框会在没有它的情况下自动提交,并且在某些浏览器中使用此代码会产生第二个POST
。
我的问题是:
为什么浏览器不能巧妙地阻止第二次发布帖子(就像Firefox在我的测试中所做的那样)?
我是否应该在所有平台的所有主流浏览器中都有这种行为?
有没有办法改进此代码,因此我使用JavaScript执行提交,但是没有提交两次表单?
答案 0 :(得分:5)
为什么浏览器不能巧妙地阻止第二次发布帖子(就像Firefox在我的测试中所做的那样)?
这是默认行为。如果您没有脚本并且默认行为导致表单不能在上输入,那该怎么办。
我是否应该在所有平台的所有主流浏览器中都有这种行为?
是
有没有办法改进此代码,因此我使用JavaScript执行提交,但是没有提交两次表单?
使用全局mutex
变量并在表单POST后设置它 - 在后续POST上检查它以进行验证。或者,从keyup
处理程序返回false并停止事件传播。
答案 1 :(得分:5)
如果表单中只有一个按钮,某些浏览器会将输入按钮解释为提交。在函数中只需return false
即可阻止默认行为提交表单。
if ($textbox.val().length > 0 && e.keyCode == 13) {
$textbox.parent('form').submit();
return false;
}
答案 2 :(得分:2)
您的表单在按下输入后立即提交(在keydown和keyup fires之前),所以你可以做
$(function() {
$('#my-textbox').keydown(function(e){
if(e.keyCode==13) e.preventDefault();
});
$('#my-textbox').keyup(function(e) {
e.preventDefault();
var $textbox = $(this);
if($textbox.val().length > 0 && e.keyCode == 13) {
$textbox.parent('form').submit();
}
});
});
答案 3 :(得分:1)
添加首次提交后将设置为true的布尔变量,并在if条件中使用该变量。这可以防止意外双击。
您还应该在应用程序后端阻止双重提交(许多Web框架都有内置的机制来实现这一点,也很容易提出自定义解决方案。)