2014-11-05 3 views
2

나는 아래의 코드를 사용하여 AJAX를 통해 양식을 제출하고 있습니다 :여러 AJAX 호출을 피하는 방법은 무엇입니까?

내 PHP 처리기가 다양한 작업을 수행 한 후 응답을 다시 전송

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

배경입니다. 그런 다음 성공 또는 오류 기능 중 하나에서 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

+0

@Antoniossss 비활성화 할 수있는 모든 태그 (제출, 입력, 선택)에 적용됩니다. 다른 사람들은 클래스를 사용하여 비활성화 된 스타일로 변경할 수 있습니다. – Raidri

+0

그게 왜 DOM 수정의 플래그 insteed를 사용했는지. 어쨌든 Upvote. – Antoniossss

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

+0

항상 : function (data) {isSubmitting = true; } 모든 케이스를 포함합니다 – acarayol

+0

@henrywright 사실, 버튼을 비활성화하는 것이 좋지만, 이벤트 타겟이 불안정하지 않으면 어떻게합니까? 예를 들어, 태그 허풍은 font-awesome을 사용하는 경우 일반적으로 사용됩니다. 이것은 반드시 IMHO에 응답해야합니다. – Antoniossss

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

Fixed, thanks @Raidri – Solrac

+1

버튼을 숨길 수는 있지만 페이지의 다른 버튼이나 요소가 여유 공간으로 이동하면 부작용이 발생할 수 있습니다. – Raidri

+0

그건 어색 할거야 ... 그는 또한 BlockUI와 같은 것을 사용하여 폼을 차단하고 멋지게 보이게 할 수있다. 키스. 대신 : v – Solrac

관련 문제