jquery:防止在第一个事件完成之前重新提交表单

jquery: prevent resubmission of form until first one event is done

我有一个通过 Ajax / jQuery 拦截的表格。 这里的问题是,如果某些字段未填写,我会显示从 textStatus 到错误 div 的错误。 然后我的函数完全删除 div 并在删除原始的后重新插入一个新的空的(为了显示错误再次使用 div )。 发生的情况是,如果我多次提交表单,新错误 div 将在 dom 中插入多次,并且错误将立即在原始错误 div 中出现三次.我当然只需要显示一个错误 div 和一组错误。 我的脚本如下:

jQuery(function ($) {
    $(document).ready(function () {

        $("#AddModel").on("submit", function (e) {

            var SubmitButton = $("#AddBtn");

            SubmitButton.blur();

            var form = $(this);

            var postData = new FormData($("#AddModel")[0]);

            var errors = $('#errors');

            var theForm = $('#theForm');

            var divAlert = "<div id=\"errors\">AAA<\/div>";

            $.ajax({
                type: 'POST',
                url: form.prop('action'),
                processData: false,
                contentType: false,
                data: postData,
                success: function (data) {

                    console.log(data);

                },

                error: function (textStatus) {

                    var json = JSON.parse(textStatus.responseText);

                    $.each(json, function (key, value) {

                        var errorVar = "";
                        errorVar += "<div id=\"error\" class=\"col-lg-6 alert alert-danger\">";
                        errorVar += "" + value + "";
                        errorVar += "<a class=\"close\" data-dismiss=\"alert\">×<\/a>";
                        errorVar += "<\/div>";

                        errors.append(errorVar);

                    });

                    if (errors.is(":visible")) {

                        errors.not('.alert-important').delay(7000).fadeOut(350).promise().done(function () {

                            errors.remove().promise().done(function () {

                                $(divAlert).insertAfter(theForm);


                            })

                        });

                    }

                }

            });
            e.preventDefault();
        });
    });
});

比如初期我在页面中会有这样的情况:

<div id="errors"></div>

如果我最后连续按提交按钮 3 次,在显示错误并删除 div 之后,我将在页面中看到这种情况:

<div id="errors"></div>
<div id="errors"></div>
<div id="errors"></div>

插入这三个元素之前发生的事情是:

<div id="errors" style="display: none;">

我想这是在脚本的 fadeOut(350) 部分。

我想要实现的是,如果按下按钮,然后等待脚本完成,然后能够再次提交。 我不喜欢超时选项,因为我不知道浏览器将花费多少时间来显示错误,然后删除并重新插入错误 div。那么,在脚本的这一部分结束之前,我该如何禁用后续提交呢? ->

if (errors.is(":visible")) {

                        errors.not('.alert-important').delay(7000).fadeOut(350).promise().done(function () {

                            errors.remove().promise().done(function () {

                                $(divAlert).insertAfter(theForm);


                            })

                        });

                    }  

您可以通过在 on('submit') 函数之前声明一个变量来跟踪您的脚本进度,并使用它来限制提交:

jQuery(function ($) {
  $(document).ready(function () {

    var isEnded=true;
    $("#AddModel").on("submit", function (e) {

      if(isEnded){
        isEnded=false;
         .... YOUR CODE
      }

    });
  });
});

当您的特定代码部分结束时,只需添加:

isEnded=true;