防止多个表单提交。有一个简单的解决方案

时间:2015-03-18 20:42:42

标签: javascript jquery ajax

我不知道如何防止ajax中的多个表单提交。我现在在网上看到的是非工作解决方案或真正的庞然大物(这些微观任务的大量曲线代码。为什么?)。我现在拥有的是这段代码:

$('#btn').click(function(){
  $('#form').submit(function(e){
    var postData = $(this).serializeArray(),
    formURL = $(this).attr('action');
    $.ajax({
        url:formURL,
        type:'POST',
        data:postData,
        success:function(data, textStatus, jqXHR){

        },
        error:function(jqXHR, textStatus, errorThrown){

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

我希望有一个一流的优雅解决方案,就像一些神秘的属性或函数调用。

3 个答案:

答案 0 :(得分:2)

尝试以下方法:

 $('#btn').click(function(){
  $(this).prop("disabled",true);
  $('#form').submit(function(e){
    var postData = $(this).serializeArray(),
    formURL = $(this).attr('action');
    $.ajax({
        url:formURL,
        type:'POST',
        data:postData,
        success:function(data, textStatus, jqXHR){
              $('#btn').prop("disabled",false);
        },
        error:function(jqXHR, textStatus, errorThrown){
              //handle error
        }
    });
    e.preventDefault();
  });
});

答案 1 :(得分:1)

$('#form').submit(function(e){
$('#btn').attr('disabled', 'disabled');
var postData = $(this).serializeArray(),
formURL = $(this).attr('action');
$.ajax({
    url:formURL,
    type:'POST',
    data:postData,
    success:function(data, textStatus, jqXHR){

    },
    error:function(jqXHR, textStatus, errorThrown){

    },
    complete: function() {
        $('#btn').removeAttr('disabled');
    }

});

e.preventDefault();
});

答案 2 :(得分:1)

我通常做的是在点击时禁用提交以防止更多点击,并在完成ajax时重新启用它:

$('#btn').click(function(){
  $(this).prop('disabled', true)  // disable submit to prevent multiple sends
  $('#form').submit(function(e){
    var postData = $(this).serializeArray(),
    formURL = $(this).attr('action');
    $.ajax({
        url:formURL,
        type:'POST',
        data:postData,
        success:function(data, textStatus, jqXHR){

        },
        error:function(jqXHR, textStatus, errorThrown){

        },
        always:function(){ // it its a success or a fail, we want to re-enable it
            $(this).prop('disabled', false) 
        }
    });
    e.preventDefault();
  });
});