2014-11-05 90 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