【问题标题】:Form submitted twice using submit() on keyup在 keyup 上使用 submit() 提交了两次表单
【发布时间】:2012-05-06 11:19:15
【问题描述】:

我有一个类似这样的 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,所以在我使用 Google Chrome 和 Internet Explorer 进行测试之前一切正常。

当我在后来的浏览器中按下 Enter 键时,有时我会提交两次表单。这很容易引起注意,因为我会在我的数据库中获得重复的条目,并且我会看到两个使用 Fiddler 的 POSTs。

经过一些测试,我发现我的问题是 jQuery 代码,因为没有它,文本框会在输入时自动提交,并且在某些浏览器中使用此代码会产生第二个 POST

我的问题是:

为什么浏览器不能巧妙地阻止第二个表单发布(就像 Firefox 在我的测试中所做的那样)?

我应该在所有平台的所有主要浏览器中都看到这种行为吗?

有没有办法改进这段代码,所以我使用 JavaScript 执行提交,但没有提交两次表单?

【问题讨论】:

  • 尝试阻止默认事件。
  • 您在 keyup 上提交了表单。每次文本字段中有 keyup 事件时,您都请求 JavaScript 提交表单。你得到的正是你想要的。
  • 我不是 jquery 专家,但我会将您的代码与表单中的提交事件挂钩(或在其上挂钩阻止其默认行为的函数)
  • @EvikJames 不正确。只有当字段不为空并且按下的键是回车键时,他才会提交表单。仔细看看。
  • 如何在不使用键盘的情况下提交表单?例如,点击获得焦点、语音识别输入文本等等……什么?

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


【解决方案1】:

为什么浏览器不能巧妙地阻止第二个表单发布(就像 Firefox 在我的测试中所做的那样)?

这是默认行为。如果您没有脚本并且默认行为是表单不会在 enter 上 POST 怎么办。

我应该在所有平台的所有主要浏览器中都看到这种行为吗?

是的

有没有办法改进这段代码,所以我使用 JavaScript 执行提交,但没有提交两次表单?

使用全局 mutex 变量并在表单 POST 时设置它 - 在后续 POST 上检查它以进行验证。或者,从 keyup 处理程序返回 false 并停止事件传播。

【讨论】:

    【解决方案2】:

    如果表单中只有一个按钮,某些浏览器会将输入按钮解释为提交。只需在您的函数中添加return false 即可防止默认行为提交表单。

    if ($textbox.val().length > 0 && e.keyCode == 13) {
        $textbox.parent('form').submit();
        return false;
    }
    

    【讨论】:

    • 他在keyup中这样做,所以阻止默认为时已晚。请参阅@Sheikh 的示例。
    • @Hexxagonal 我在 Chrome18 和 IE8 中只看到一个回发,所以我无法验证你的测试。
    【解决方案3】:

    您的表单在按下 Enter 后立即提交(在 keydown 和 keyup 触发之前),所以您可以这样做

    $(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.

    【讨论】:

      【解决方案4】:

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

      您还应该在应用程序后端防止重复提交(许多 Web 框架都有这样做的内置机制,也很容易提出自定义解决方案)。

      【讨论】:

      • 我试过了,但还是收到了两篇表单帖子:一篇来自我的代码,一篇来自浏览器的默认事件。
      猜你喜欢
      • 2014-08-04
      • 2018-04-02
      • 2013-11-16
      • 2011-03-12
      • 2013-07-19
      • 2023-03-12
      • 2015-05-19
      • 2019-11-11
      • 2018-10-28
      相关资源
      最近更新 更多