2014-11-05 87 views
2

我通過AJAX使用下面的代碼提交表單:如何避免多個AJAX調用?

$('form').submit(function(e) { 

    $.ajax({ 
     type: 'POST', 
     url: ajax_url, 
     dataType: 'json', 
     data: { 
      'action': 'my_action', 
      'str': $('form').serialize() 
     }, 
     success: function(data) { 
      // Do something here. 
     }, 
     error: function(data) { 
      // Do something here. 
     } 
    }); 
    return false; 
}); 

背景

我的PHP處理程序執行各種任務,然後發回一個響應。然後,我可以在成功或錯誤功能中使用data做一些事情。

我的問題

當用戶雙擊窗體上的提交按鈕,兩名AJAX調用發生導致我的PHP處理程序中的代碼執行兩次。

我的問題

我怎樣才能避免我的代碼被執行,如果在提交用戶雙擊兩次?

回答

5

當AJAX呼叫回來時,在第一次點擊時禁用提交按鈕並重新啓用它。

例如:

$('form').submit(function(e) { 
    var $form = $(this); 
    $form.find('submit').attr('disabled', true); 
    $.ajax({ 
     type: 'POST', 
     url: ajax_url, 
     dataType: 'json', 
     data: { 
      'action': 'my_action', 
      'str': $('form').serialize() 
     }, 
     complete: function() { 
      $form.find('submit').removeAttr('disabled'); 
     }, 
     success: function(data) { 
      // Do something here. 
     }, 
     error: function(data) { 
      // Do something here. 
     } 
    }); 
    return false; 
}); 
+0

對於任何標籤都適用? 例如 – Antoniossss 2017-10-18 08:45:49

+0

@Antoniossss它可以用於任何可以禁用的標籤(提交,輸入,選擇)。對於其他人,您可以使用班級更改爲禁用的樣式。 – Raidri 2017-10-18 08:47:34

+0

這就是爲什麼我使用DOM修改標誌。無論如何Upvote。 – Antoniossss 2017-10-18 08:50:47

11

只需添加一些有控制變量:

var isSubmitting = false; 

$('form').submit(function(e) { 
    if(isSubmitting) { 
     return; 
    } 
    isSubmitting = true; 
    $.ajax({ 
     type: 'POST', 
     url: ajax_url, 
     dataType: 'json', 
     data: { 
      'action': 'my_action', 
      'str': $('form').serialize() 
     }, 
     success: function(data) { 
      isSubmitting = false; 
      // Do something here. 
     }, 
      error: function(data) { 
      isSubmitting = false; 
      // Do something here. 
     } 
    }); 
    return false; 
}); 
+2

這很可能是值得接受的答案,但我有點喜歡禁用按鈕的想法(這表明正在發生的事情)。請接受+1代替。謝謝! – henrywright 2014-11-05 23:01:21

+0

always:function(data){isSubmitting = true; }包含所有情況 – acarayol 2017-09-14 14:55:19

+0

@henrywright true,禁用按鈕看起來不錯,但是如果事件目標不能解除?例如如果您使用font-awesome,則通常使用的標籤。這應該被接受回答恕我直言。 – Antoniossss 2017-10-18 08:52:10

1

只是隱藏和顯示上提交的提交按鈕。

$('form').submit(function(e) { 
    $('#my_button').hide(); 
    $.ajax({ 
    type: 'POST', 
    url: ajax_url, 
    dataType: 'json', 
    data: { 
     'action': 'my_action', 
     'str': $('form').serialize() 
    }, 
    success: function(data) { 
     // Do something here. 
    }, 
    error: function(data) { 
     // Do something here. 
    }, 
    complete: function(){ 
     $('#my_button').show(); 
    } 
}); 
return false; 

});

+0

固定,謝謝@Raidri – Solrac 2014-11-05 23:01:14

+1

隱藏按鈕是可能的,但如果頁面上的其他按鈕或元素移動到可用空間時可能會產生副作用。 – Raidri 2014-11-05 23:05:21

+0

這會很尷尬......他還可以使用BlockUI之類的東西來阻止表單,並使其看起來很花哨;吻。相反:v – Solrac 2014-11-05 23:11:33