表单在keyup上使用submit()提交两次

时间:2012-04-25 18:10:46

标签: javascript jquery forms javascript-events double-submit-problem

我有一个与此类似的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执行提交,但是没有提交两次表单?

4 个答案:

答案 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();
        }
     });
 });​

A simple test.

答案 3 :(得分:1)

添加首次提交后将设置为true的布尔变量,并在if条件中使用该变量。这可以防止意外双击。

您还应该在应用程序后端阻止双重提交(许多Web框架都有内置的机制来实现这一点,也很容易提出自定义解决方案。)