Skąd mam wiedzieć, czy jQuery ma oczekujące żądanie Ajax?

90

Mam pewne problemy z utworzoną przez nas kontrolką jQuery. Załóżmy, że masz listę rozwijaną, która umożliwia wprowadzenie identyfikatora poszukiwanego elementu, a po naciśnięciu klawisza ENTER lub utracie fokusu w polu tekstowym sprawdza ona za pośrednictwem jQuery, że wprowadzony identyfikator jest poprawny, wyświetlając alert, jeśli tak nie jest 't.

Chodzi o to, że gdy zwykły użytkownik wpisze w niej nieprawidłową wartość i straci fokus poprzez naciśnięcie przycisku wysyłania, post jQuery wraca po wysłaniu formularza.

Czy jest jakiś sposób, żebym mógł sprawdzić, czy istnieje przetwarzanie żądań asynchronicznych przez jQuery, abym nie zezwalał na przesyłanie formularza?

sabanito
źródło

Odpowiedzi:

37

Możesz użyć ajaxStart i ajaxStop do śledzenia, kiedy żądania są aktywne.

ceejayoz
źródło
To działało lepiej dla mnie, ponieważ moja formant była renderowana wiele razy za pomocą HtmlHelper. Dzięki!
sabanito
To zadziałało dla mnie! Używałem ajaxSend i ajaxSuccess, ale czasami miałem wysłanych kilka żądań ajax i chciałem tylko uruchomić część kodu raz na początku i raz na końcu. ajaxStart i ajaxStop było dokładnie tym, czego szukałem! Dzięki
ScottyG
2
W 2019 linki są nieaktualne
Kristian Nissen
229

$.active zwraca liczbę aktywnych żądań Ajax.

Więcej informacji tutaj

sivabudh
źródło
To faktycznie odpowiada na pytanie. Dzięki.
Dave Salomon,
Jedna wkładka i krótkie rozwiązanie bardzo ładne
MSTdev
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);
 });
etgregor
źródło
Wydaje się być dobrym rozwiązaniem, ale czy wykryłeś jakiś problem z „Maksymalnym rozmiarem stosu wywołań”?
Mikel
11

Funkcja $ .ajax () zwraca obiekt XMLHttpRequest. Przechowuj to w zmiennej, która jest dostępna ze zdarzenia „OnClick” przycisku Prześlij. Po przetworzeniu kliknięcia przesyłania sprawdź, czy zmienna XMLHttpRequest to:

1) null, co oznacza, że ​​żadne żądanie nie zostało jeszcze wysłane

2), że readyState ma wartość 4 (Loaded). Oznacza to, że żądanie zostało wysłane i zwrócone pomyślnie.

W każdym z tych przypadków zwróć wartość true i pozwól, aby przesyłanie było kontynuowane. W przeciwnym razie zwróć false, aby zablokować przesyłanie i dać użytkownikowi pewne wskazanie, dlaczego ich przesłanie nie zadziałało. :)

Toji
źródło
4
Sprawdzanie wartości null w celu ustalenia, czy obiekt żądania istnieje, jest ważne, ale jeśli nie jest ono puste, należy naprawdę sprawdzić, request.readyState > 0 && request.readyState < 4aby określić żądanie „aktywne”, ponieważ readyState 0 wskazuje, że chociaż obiekt został utworzony, żądanie sieciowe nie zostało zainicjowane .
Nathan Taylor
1

Musimy użyć metody $ .ajax.abort () , aby przerwać żądanie, jeśli jest ono aktywne. Ten obiekt obietnicy używa właściwości readyState, aby sprawdzić, czy żądanie jest aktywne, czy nie.

HTML

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

Kod 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 () {

            }
        });
vibs2006
źródło