如何避免多个AJAX调用?

时间:2014-11-05 22:42:32

标签: javascript php jquery 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处理程序中的代码执行两次。

我的问题

如果用户双击提交,我怎样才能避免我的代码被执行两次?

3 个答案:

答案 0 :(得分: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;
});

答案 1 :(得分: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;
});

答案 2 :(得分: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;

});