【问题标题】:jquery - how to prevent submit form continuouslyjquery - 如何防止连续提交表单
【发布时间】:2018-09-11 06:58:07
【问题描述】:

我有一个模态表单如下:

 <!-- Modal -->
    <div class="modal fade" id="myModal" role="dialog">
       <div class="modal-dialog">
          <!-- Modal content-->
          <div class="modal-content">
             <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">&times;</button>
                <h4 class="modal-title">Modal Header</h4>
             </div>
             <form id="Myform" action="/action_page.php" method="get">
                First name: <input type="text" name="fname"><br>
                Last name: <input type="text" name="lname"><br>
                <input type="button" onclick="submitform()" value="Submit">
             </form>
          </div>
       </div>
    </div>

Javascript

   function submitform() {

        //try
        //event.stopImmediatePropagation();
        //event.stopPropagation();

        //check validate is valid
        if (formValid) {
            $("#Myform").trigger("submit");
        }
    }

$("#Myform").submit(function (e) {
        e.preventDefault();
         // e.stopImmediatePropagation();
        $.ajax({
            type: this.method,
            cache: false,
            url: this.action,
            enctype: 'multipart/form-data',
            data: new FormData(this),
            processData: false,
            contentType: false,
            success: function (data) {
                    $('#create-media').modal('toggle');

                }
            },
            error: function (error) {
                console.log(error);
            }

        });
    });

目前,当用户点击提交按钮时,数据会被发送到服务器进行处理,在等待返回结果的这段时间内,modal还没有关闭,用户可以点击提交更多次。我不希望这种情况发生。 我想防止用户连续提交,不允许用户点击第二次提交按钮,用户必须等待返回的结果,如果成功,模态将被关闭。 我正在考虑禁用提交按钮,但这并不安全,因为用户可以通过用户机器上的 javascript 启用该按钮。 我尝试使用 event.stoppropagation () 和 event.stopimmediatepropagation () 但它不起作用。 难道我做错了什么?如何防止用户连续提交?

谢谢大家

【问题讨论】:

    标签: javascript jquery forms bootstrap-modal form-submit


    【解决方案1】:

    按照CertainPerformance 的想法,我建议您使用变量。但是,我建议不要将变量放在代码的开头,而是使用 Ajax 提供的beforeSend 回调,它将在发送请求之前被调用。

    var isBusy = false;
    $("#Myform").submit(function (e) {
        e.preventDefault();
        if(isBusy) {
            return;
        }
        $.ajax({
            type: this.method,
            cache: false,
            url: this.action,
            enctype: 'multipart/form-data',
            data: new FormData(this),
            processData: false,
            contentType: false,
            beforeSend: function(xhr) {
                isBusy = true;
            },
            success: function (data) {
                $('#create-media').modal('toggle');
                isBusy = false;
            },
            error: function (error) {
                console.log(error);
                isBusy = false;
            }
    
        });
    });
    

    您可以了解更多关于beforeSend 回调here
    附言你也可以使用$.ajax.active变量,它返回活跃的ajax请求的数量,这可能是一个更优雅的方法。

    【讨论】:

      【解决方案2】:

      给你的submitform 函数一个持久的alreadySubmitted 变量。另外,尝试从 Javascript 而不是 HTML 附加按钮处理程序,preventDefault:

      const submitform = (() => {
        let alreadySubmitted = false;
        return (e) => {
          e.preventDefault();
          if (alreadySubmitted) return;
          alreadySubmitted = true;
          if (formValid) {
            $("#Myform").trigger("submit");
          }
        }
      })();
      
      document.querySelector('#Myform input[type="button"]').addEventListener('click', submitForm);
      

      【讨论】:

      • 我也想过这种方式,但是我的客户他们建议我使用 event.stoppropagation() 这种情况是否可以使用 event.stoppropagation()?
      • stopprogation 阻止事件冒泡到父级。我怀疑它会在这里工作
      • 检查this
      • 如上面的javascript代码(我现在已经注释掉了),我试过用了但是不行,不知道我用的好不好?
      • 不是每个人都使用 es6 语法,虽然它是未来证明编码的好习惯,但我们还没有到那里,因此,它对其他人不利,尤其是初学者
      猜你喜欢
      • 2013-08-23
      • 2012-03-09
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      相关资源
      最近更新 更多