2011-08-31 15 views
14

Chciałbym zarejestrować globalną procedurę obsługi zdarzeń dla wszystkich żądań AJAX, tak aby móc przechwytywać i obsługiwać odpowiedzi z serwera przed konkretną obsługę zdarzenia.Jak mogę przechwytywać odpowiedzi ajax w jQuery przed obsługą zdarzenia?

Na przykład, mój kod może mieć coś takiego:

$("#placeholder").load("/fragments/userpics"); 

I chciałbym, aby zarejestrować „przed” obsługi zdarzenia tak, że mógłby, na przykład, wyświetlić okno logowania jeśli odpowiedzią 401 jest zwracana, lub może spróbować ponownie, jeśli istnieje odpowiedź 503.

Pomyślałem, że $.ajaxError() jest, gdzie chciałbym zrobić coś takiego, ale najwyraźniej jest uruchamiany tylko po obsługi zdarzeń.

UPDATE: OK, oto co mam do tej pory, za pomocą @genesis:

$.ajaxPrefilter(function(options, originalOptions, jqXHR) { 
    var success = options.success; 
    options.success = function(data, textStatus, jqXHR) { 
     // override success handling 
     if(typeof(success) === "function") return success(data, textStatus, jqXHR); 
    }; 
    var error = options.error; 
    options.error = function(jqXHR, textStatus, errorThrown) { 
     // override error handling 
     if(typeof(error) === "function") return error(jqXHR, textStatus, errorThrown); 
    }; 
}); 

Po wykonaniu niektórych badań, wygląda na to, że również trzeba zastąpić options.complete.

Jednak nadal nie obejmuje to wszystkich baz, ponieważ można również dołączać zdarzenia bezpośrednio do obiektu jqXHR, a zmiana options nie pomoże w tym przypadku.

Jakieś wskazówki?

+0

http://stackoverflow.com/a/10796951/1509853? – oCcSking

Odpowiedz

5

Obsługa niestandardowych opcji Ajax lub modyfikowanie istniejących opcji przed wysłaniem każdego żądania przed przetworzeniem przez $ .ajax().

http://api.jquery.com/jQuery.ajaxPrefilter/

Założę się, że pracuje dla .load(), zbyt

+0

Mogę błędnie odczytać oryginalne pytanie lub dokumentację jQuery, ale wygląda na to, że 'ajaxPrefilter' będzie interweniować ** przed ** żądanie zostanie wysłane, a @itsadok chce coś zainterweniować ** po ** żądanie jest wysłane i odpowiedź zostanie odebrana, ale zanim zostanie przetworzona. –

+0

@Rick, sztuczka polega na zastąpieniu options.success i options.error. Nadal to rozpracowuję. – itsadok

+0

@itadok, czy 'ajaxComplete()' nie byłoby lepszym miejscem, aby go złapać? Czy to zbyt późno w cyklu? Przyznam, że jQuery nie jest moją mocną stroną ... –

17

Jeśli chcesz do obsługi danych pochodzących z serwera przed obsługi zdarzeń, użyj datafilter:

jQuery.ajaxSetup({ 
     dataFilter: function (data, type) { 
      //modify the data 

      return data; 
     } 
    }); 
+1

jQuery, a nie jquery – Yegor

0

Hugo Forte ma poprawną odpowiedź, jedynym sposobem na przechwycenie odpowiedzi Ajax przed wywołaniem jakichkolwiek procedur obsługi zdarzeń jest użycie dataFilter.

Musiałem użyć tego dzisiaj, aby obsłużyć przekierowanie odpowiedzi ajax po stronie klienta bez zbytniej refaktoryzacji kodu.

$.ajaxSetup({ 
    dataFilter: function (data, type) { 
     if (data !== "" && data === "NOAUTH") { 
      window.location = '/'; 
     } 
     return data; 
    } 
}); 
Powiązane problemy