2011-08-31 11 views
14

Desidero registrare un gestore di eventi globale per tutte le richieste AJAX, in modo da poter intercettare e gestire le risposte dal server prima del al gestore di eventi specifico.Come posso intercettare le risposte ajax in jQuery prima del gestore eventi?

Per esempio, il mio codice potrebbe avere qualcosa di simile:

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

e mi piacerebbe registrare un gestore di "prima" evento in modo che ho potuto, ad esempio, visualizzare una finestra di login se una risposta 401 viene restituito, o forse riprovare se c'è una risposta 503.

Ho pensato che $.ajaxError() è dove vorrei fare qualcosa di simile, ma a quanto pare è attivato solo dopo il gestore di eventi.

UPDATE: OK, ecco quello che ho ottenuto finora, con l'aiuto di @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); 
    }; 
}); 

Dopo aver fatto qualche test, sembra che io avrei anche bisogno di sovrascrivere options.complete.

Tuttavia, questo non copre ancora tutte le basi, poiché è anche possibile allegare eventi direttamente all'oggetto jqXHR e in questo caso non è possibile modificare options.

Qualche consiglio?

+0

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

risposta

5

Gestire le opzioni Ajax personalizzate o modificare le opzioni esistenti prima che ogni richiesta venga inviata e prima che vengano elaborate da $ .ajax().

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

Scommetto che lavora per .load(), anche

+0

Potrei avere frainteso la domanda originale oi documenti jQuery, ma mi sembra che 'ajaxPrefilter' interverrà ** prima ** la richiesta viene inviata e @itsadok vuole che qualcosa intervenga ** dopo ** la richiesta è inviato e la risposta viene ricevuta ma prima che venga elaborata. –

+0

@Rick, il trucco è sovrascrivere options.success e options.error. Sto ancora lavorando, comunque. – itsadok

+0

@itsadok, non sarebbe 'ajaxComplete()' il posto migliore per catturarlo? O è troppo tardi nel ciclo? Ammetto che jQuery non è il mio forte seme ... –

17

Se si desidera gestire i dati provenienti dal server prima che il gestore di eventi, utilizzare DATAFILTER:

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

      return data; 
     } 
    }); 
+1

jQuery, non jquery – Yegor

0

Hugo Forte ha la risposta corretta, l'unico modo per intercettare una risposta Ajax prima che vengano chiamati tutti i gestori di eventi è usare dataFilter.

Ho dovuto usarlo oggi per gestire il reindirizzamento delle risposte ajax dal lato client senza dover riscrivere troppo il codice.

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