繁体   English   中英

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

[英]Form submitted twice using submit() on keyup

我有一个类似于这样的 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 的POST

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

我的问题是:

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

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

有没有办法改进此代码,以便我使用 JavaScript 执行提交,但不会将表单提交两次?

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

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

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

是的

有没有办法改进此代码,以便我使用 JavaScript 执行提交,但不会将表单提交两次?

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

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

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

您的表单在按下 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();
        }
     });
 });​

一个简单的测试。

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

您还应该防止应用程序后端中的双重提交(许多 Web 框架都有执行此操作的内置机制,也很容易提出自定义解决方案)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM