2015-03-18 70 views
1

我不知道如何防止在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(); 
    }); 
}); 

我希望能有一個一杆完美的解決方案,像一些神祕的屬性或函數調用。

+0

你可以禁用#btn點擊並在ajax結束時重新啓用,其通常的做法 – juvian 2015-03-18 20:44:08

+2

神祕:http://api.jquery.com/one/ – 2015-03-18 20:48:46

回答

1

我最常做的是禁止提交的點擊,以防止更多的點擊,當阿賈克斯完成重新啓用它:

$('#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(); 
    }); 
}); 
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(); 
    }); 
}); 
+0

如果窗體上出現錯誤,會發生什麼,因爲您沒有啓用錯誤按鈕? – 2015-03-18 20:52:04

+0

這是由你來處理你想要的方式!例如,您可以再次啓用該按鈕。 – callback 2015-03-18 20:53:11

+0

你應該關閉提交按鈕而不是成功。否則,雙擊仍然會註冊兩次。 – 2015-03-18 20:58:09

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(); 
}); 
+0

在這個任務的上下文中,'complete'和'always'屬性有區別嗎? – Jacobian 2015-03-18 21:04:52

+0

不知道,但恕我直言,你應該去完成。這是你從jquery網站得到的: 當請求結束時(在成功和錯誤回調執行後)被調用的函數。該函數獲得兩個參數:jqXHR(在jQuery 1.4.x中,XMLHTTPRequest)對象和一個字符串,用於分類請求的狀態(「成功」,「未修改」,「nocontent」,「錯誤」,「超時」,「中止「或」parsererror「) – 2015-03-18 21:08:14

+0

歡迎您!我的關於「始終」的錯誤往往被棄用 完整回調選項的替代構造,.always()方法取代了不推薦使用的.complete()方法。無論如何, – 2015-03-18 21:10:50