Funkcja jQuery.active

102

Próbowałem znaleźć więcej informacji na temat następującej funkcji jQuery:

jQuery.active

Opisano, że testuje liczbę aktywnych połączeń z serwerem i zwraca wartość prawda, gdy liczba połączeń wynosi zero.

Nie mogłem znaleźć żadnych informacji o tej funkcji w serwisie jQuery i zastanawiałem się, czy ktoś wie, gdzie mogę.

RyanP13
źródło

Odpowiedzi:

163

Jest to zmienna, której jQuery używa wewnętrznie, ale nie miała powodu, aby się ukrywać, więc można ją wykorzystać. Tylko jedno ostrzeżenie, to będzie jquery.ajax.activenastępne wydanie . Nie ma dokumentacji, ponieważ jest ujawniona, ale nie w oficjalnym API, w rzeczywistości wiele rzeczy jest takich, jak jQuery.cache(gdzie wszystkiejQuery.data() idzie).

Zgaduję, że przez rzeczywiste użycie w bibliotece wydaje się być tam wyłącznie do obsługi $.ajaxStart()i $.ajaxStop()(co wyjaśnię dalej), ale obchodzi ich tylko to, czy jest 0, czy nie, gdy żądanie zaczyna się lub kończy. Ale ponieważ nie ma powodu, aby to ukrywać, jest on ujawniany, możesz zobaczyć rzeczywistą liczbę jednoczesnych żądań AJAX, które są obecnie wykonywane.


Kiedy jQuery uruchamia żądanie AJAX, dzieje się tak :

if ( s.global && ! jQuery.active++ ) {
  jQuery.event.trigger( "ajaxStart" );
}

To jest to, co powoduje uruchomienie $.ajaxStart()zdarzenia, liczba połączeń właśnie wzrosła z 0 do 1 ( jQuery.active++nie jest 0 po tym, i !0 == true), co oznacza, że ​​rozpoczęto pierwsze z bieżących jednoczesnych żądań. To samo dzieje się na drugim końcu. Gdy żądanie AJAX zatrzymania (z powodu na beforeSendAbort poprzezreturn false lub połączenia Ajax completebiegnie funkcyjne )

if ( s.global && ! --jQuery.active ) {
  jQuery.event.trigger( "ajaxStop" );
}

To właśnie powoduje uruchomienie $.ajaxStop()zdarzenia, liczba żądań spadła do 0, co oznacza, że ​​ostatnie jednoczesne połączenie AJAX zostało zakończone. W innych koparki globalny AJAX ogień tam po drodze, jak również.

Nick Craver
źródło
2
Widziałem to opisane w książce jQuery Novice to Ninja (2010)
jmav
@ Nick: Zgodnie z twoim wyjaśnieniem .ajaxStop będzie wykonywany po zakończeniu każdego wywołania Ajax. Ale zostanie wywołane, jeśli wszystkie wywołania AJAX zostały zakończone. Czy możesz mnie poprawić, jeśli się mylę.
Kishore Relangi
27
To się teraz nazywa $.active, przy okazji.
Ryan Bigg,
4
@RyanBigg nie jest $po prostu aliasem dla jQuery, więc oba są nadal prawdziwe?
arxpoetica
2
@ArxPoetica tylko wtedy, gdy biegasz jQuerybez noConflict.
Ryan Bigg
19

Dla każdego, kto próbuje używać jQuery.active z żądaniami JSONP (tak jak ja), musisz go włączyć w ten sposób:

jQuery.ajaxPrefilter(function( options ) {
    options.global = true;
});

Pamiętaj, że będziesz potrzebować limitu czasu na żądanie JSONP, aby wykryć awarie.

Sean Bannister
źródło