Prevent multiple clicks on submit!

1

I have a form that registers the name of the person in a database via ajax, however sometimes it takes time to send and returns and I give 2 or 3 clicks it sends the same data! I wanted to know how to prevent this, I tried:

    <script>
    var statSend = false;
    function checkSubmit() {
    if (!statSend) {
    statSend = true;
    return true;
    } else {
    alert("O formulário esta sendo enviado…");
    return false; }
    }
    </script>

and

    onclick="this.disabled=true; this.value = 'Aguarde…'; this.form.submit();"

and among others, but none of them worked! someone help!?

             <h4>Cadastro de Nome</h4>
    <form id="cadUsuario" method="post">
        <label>Nome:</label><input required type="text" name="nome" id="nome" />
        <br/><br/>
        <input type="submit" value="Salvar" id="salvar"  />
    </form>
    <script type="text/javascript">
        $(function () {    
            $("#cadUsuario").submit(function (e) {
            e.preventDefault();
            var FormData = $(this).serialize(); 
                $.ajax({
                  type: "POST", 
                  url: "salvar.php",
                  dataType: "json", // Add datatype
                  data: FormData
                }).done(function (data) {
                    $('#cadUsuario').trigger("reset");
                    var mensagem = '';
                    if (!data.insert){
                        mensagem = 'Falha no cadastro';
                    }
                /* if(!data.email){
                    mensagem += 'Falha no envio do email';
                   }*/
                    if(data.insert/* && data.email*/){
                        mensagem = 'Operação realizda com sucesso';
                    }
                    alert(mensagem);
                }, "json");
            return false;
            }); 
        });
    </script>
    
asked by anonymous 05.12.2016 / 13:15

2 answers

2

Just create a variable and within .submit(...); set the value true and the event jqXHR.ajax.always is false again at the beginning of .submit add if to check if it is already true .

First of all, remove this:

onclick="this.disabled=true; this.value = 'Aguarde…'; this.form.submit();"

And this function is also dispensable :

var statSend = false;
function checkSubmit() {
if (!statSend) {
statSend = true;
return true;
} else {
alert("O formulário esta sendo enviado…");
return false; }
}

The result should be:

$(function () {
    var enviandoForm = false;

    $("#cadUsuario").submit(function (e) {
        if (enviandoForm) {
              return false;
        }

        /*
        Isto é apenas para desabilitar o form, mas a garantia
        está na variavel booleana
        */
        this.disabled = true;

        enviandoForm = true;

        e.preventDefault();
        var FormData = $(this).serialize(); 

        $.ajax({
          type: "POST", 
          url: "salvar.php",
          dataType: "json", // Add datatype
          data: FormData
        }).done(function (data) {
            $('#cadUsuario').trigger("reset");
            var mensagem = '';
            if (!data.insert){
                mensagem = 'Falha no cadastro';
            }
        /* if(!data.email){
            mensagem += 'Falha no envio do email';
           }*/
            if(data.insert/* && data.email*/){
                mensagem = 'Operação realizda com sucesso';
            }
            alert(mensagem);
        }).always(function() {
            enviandoForm = false; //Libera o form
            this.disabled = false;
        });

        return false;
    }); 
});
    
05.12.2016 / 13:37
0

I would do it as follows:

 <h4>Cadastro de Nome</h4>
<form id="cadUsuario" method="post">
    <label>Nome:</label><input required type="text" name="nome" id="nome" />
    <br/><br/>
    <input type="submit" value="Salvar" id="salvar"  />
</form>
<script type="text/javascript">
    $(function () {    
        $("#cadUsuario").submit(function (e) {
        $('#salvar').prop('disabled', true);
        e.preventDefault();
        var FormData = $(this).serialize(); 
            $.ajax({
              type: "POST", 
              url: "salvar.php",
              dataType: "json", // Add datatype
              data: FormData
            }).done(function (data) {
                $('#cadUsuario').trigger("reset");
                var mensagem = '';
                if (!data.insert){
                    mensagem = 'Falha no cadastro';
                }
            /* if(!data.email){
                mensagem += 'Falha no envio do email';
               }*/
                if(data.insert/* && data.email*/){
                    mensagem = 'Operação realizda com sucesso';
                }
                alert(mensagem);
                $('#salvar').prop('disabled', false);
            }, "json");
        return false;
        }); 
    });
</script>

Disabling the fact button during ajax , and releasing again only after alert , thus ensuring that there is no undue duplication of data.

    
05.12.2016 / 13:39