jQuery에 Ajax 요청이 보류 중인지 어떻게 알 수 있습니까?


90

우리가 만든 jQuery 컨트롤에 몇 가지 문제가 있습니다. 찾고있는 항목의 ID를 입력 할 수있는 드롭 다운 목록이 있고 Enter 키를 누르거나 텍스트 상자에서 포커스를 잃으면 jQuery를 통해 입력 한 ID가 올바른지 확인하고 그렇지 않은 경우 경고를 표시한다고 가정합니다. '티.

문제는 일반 사용자가 유효하지 않은 값을 입력하고 제출 버튼을 눌러 포커스를 잃으면 양식 제출이 전송 된 후 jQuery 게시물이 반환된다는 것입니다.

양식 제출을 허용하지 않도록 jQuery에서 처리하는 비동기 요청이 있는지 확인할 수있는 방법이 있습니까?

답변:


37

ajaxStartajaxStop 을 사용 하여 요청이 활성 상태 인시기를 추적 할 수 있습니다 .


내 컨트롤이 HtmlHelper를 사용하여 여러 번 렌더링 되었기 때문에 이것은 나를 위해 더 잘 작동했습니다. 고마워!
sabanito

이것은 나를 위해 일했습니다! 나는 ajaxSend와 ajaxSuccess를 사용하고 있었지만 때때로 여러 개의 ajax 요청을 보냈고 처음에는 한 번, 끝에서는 한 번만 코드를 실행하고 싶었습니다. ajaxStart와 ajaxStop은 정확히 내가 찾던 것이었다! 감사합니다
ScottyG

2
2019 년 링크는 구식입니다
Kristian Nissen


25
 $(function () {
        function checkPendingRequest() {
            if ($.active > 0) {
                window.setTimeout(checkPendingRequest, 1000);
                //Mostrar peticiones pendientes ejemplo: $("#control").val("Peticiones pendientes" + $.active);
            }
            else {

                alert("No hay peticiones pendientes");

            }
        };

        window.setTimeout(checkPendingRequest, 1000);
 });

좋은 해결책 인 것 같지만 "최대 호출 스택 크기"에 문제가 있습니까?
Mikel

11

$ .ajax () 함수는 XMLHttpRequest 객체를 반환합니다. 제출 버튼의 "OnClick"이벤트에서 액세스 할 수있는 변수에 저장합니다. 제출 클릭이 처리되면 XMLHttpRequest 변수가 다음과 같은지 확인하십시오.

1) null, 아직 전송 된 요청이 없음을 의미합니다.

2) readyState 값은 4 (Loaded)입니다. 이는 요청이 성공적으로 전송 및 반환되었음을 의미합니다.

두 경우 모두 true를 반환하고 제출이 계속되도록 허용합니다. 그렇지 않으면 false를 반환하여 제출을 차단하고 사용자에게 제출이 작동하지 않은 이유를 표시합니다. :)


4
요청 객체가 있는지 확인하기 위해 null을 확인하는 것이 중요하지만, null이 아닌 경우에는 request.readyState > 0 && request.readyState < 4readyState 0이 객체가 생성되었지만 웹 요청이 시작되지 않았 음을 나타 내기 때문에 '활성'요청을 확인 하기 위해 실제로 확인해야합니다. .
Nathan Taylor

1

우리는 활용해야 $ .ajax.abort () 요청이 활성화 된 경우 중단 요청 방법. 이 promise 객체는 readyState 속성을 사용 하여 요청이 활성 상태인지 여부를 확인합니다.

HTML

<h3>Cancel Ajax Request on Demand</h3>
<div id="test"></div>
<input type="button" id="btnCancel" value="Click to Cancel the Ajax Request" />

JS 코드

//Initial Message
var ajaxRequestVariable;
$("#test").html("Please wait while request is being processed..");

//Event handler for Cancel Button
$("#btnCancel").on("click", function(){
if (ajaxRequestVariable !== undefined)

if (ajaxRequestVariable.readyState > 0 && ajaxRequestVariable.readyState < 4)
{
  ajaxRequestVariable.abort();
  $("#test").html("Ajax Request Cancelled.");
}
});

//Ajax Process Starts
ajaxRequestVariable = $.ajax({
            method: "POST",
            url: '/echo/json/',
            contentType: "application/json",
            cache: false,
            dataType: "json",
            data: {
        json: JSON.encode({
         data:
             [
                            {"prop1":"prop1Value"},
                    {"prop1":"prop2Value"}
                  ]         
        }),
        delay: 11
    },

            success: function (response) {
            $("#test").show();
            $("#test").html("Request is completed");           
            },
            error: function (error) {

            },
            complete: function () {

            }
        });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.