gestire l’errore ajax quando un utente fa clic su Aggiorna

Mi scuso se questo è qualcosa che dovrei essere in grado di cercare. tutti i termini che volevo erano molto sovraccarichi ..

ecco il mio problema: quando apro una pagina, spara un’intera serie di chiamate Ajax. se poi premo Maiusc + Aggiorna, tutte quelle chiamate ajax vengono considerate errori e mostrano le loro windows di dialogo dei messaggi di errore prima che l’intera pagina si ricarichi.

quindi l’errore viene triggersto dal client – è comunque ansible scoprire se questo è il caso, quindi posso ignorarlo? ad esempio nella richiesta xmlhttp o nella funzione Ajax (sto usando jquery btw)

[questa è una modifica della risposta precedente, che aveva domande in sospeso che ho risolto da allora]

jQuery genera l’evento di errore quando l’utente si allontana dalla pagina aggiornando, facendo clic su un collegamento o modificando l’URL nel browser. È ansible rilevare questi tipi di errori implementando un gestore errori per la chiamata ajax e ispezionando l’object xmlHttpRequest:

$.ajax({ /* ajax options omitted */ error: function (xmlHttpRequest, textStatus, errorThrown) { if(xmlHttpRequest.readyState == 0 || xmlHttpRequest.status == 0) return; // it's not really an error else // Do normal error handling }); 

Esistono diversi approcci suggeriti per rilevare questo:

  • Diversi hanno suggerito l’uso di un gestore di beforeunload per impostare un flag booleano in modo che il gestore degli errori possa sapere che la pagina viene scaricata (vedere l’elenco dei post correlati / duplicati di seguito). Questo è grandioso, tranne che Safari mobile su iOS non supporta l’evento beforeunload .

  • Sachindra ha suggerito un approccio in cui invece di triggersre immediatamente la funzione di errore, è stato ritardato di un secondo in un setTimeout(..., 1000) . In questo modo, c’è una buona probabilità che la pagina sia effettivamente scomparsa quando viene chiamato il gestore degli errori. “Buona possibilità”. Scommetto che se ho una pagina enorme con, ad esempio, molti s, potrebbe volerci più di 1 secondo per scaricare, e quindi forse il gestore degli errori dovrebbe sparare comunque.

Suggerisco quindi una combinazione di rilevamento affidabile del supporto prima del carico e se prima il carico non è supportato ( tosse per l’ iPad / iPhone), tornare al trucco ritardato di Sachindra.

Guarda la soluzione completa con il rilevamento del pre-caricamento e tutto in questo jsfiddle .

Sembra che la situazione sia un po ‘migliore per jQuery 2.x che per 1.x , ma anche 2.x sembra un po’ flakey, e quindi trovo questo suggerimento prudente.

PS: c’erano anche suggerimenti per testare alcuni campi XHR / jqXHR . ( Qui e qui ). Non ho mai incontrato una combinazione in grado di distinguere tra la navigazione dell’utente e il riavvio del server Web durante una chiamata AJAX di lunga durata e pertanto non ho trovato questo approccio utile per me.

Questa è in realtà anche una risposta a queste domande relative allo Stack Overflow correlate / duplicate:

  • jQuery AJAX triggers la richiamata di errore nella finestra di scaricamento?
  • $ .ajax chiama il gestore di successo quando la richiesta non riesce a causa del ricaricamento del browser
  • Il modo migliore per gestire gli errori durante le chiamate ajax jquery causate dall’utente facendo clic sui collegamenti
  • Rilevare che una chiamata jQuery.ajax non è riuscita perché la pagina si sta ricaricando?

e questi post all’esterno di Stack Overflow:

  • Qual è il modo corretto di gestire l’errore AJAX a causa del ricaricamento della pagina?
  • Come distinguere una chiamata AJAX abortita dall’utente da un errore | Mi piacciono le cose.
 var isPageBeingRefreshed = false; window.onbeforeunload = function() { isPageBeingRefreshed = true; }; $.ajax({ error: function (xhr, type, errorThrown) { if (!xhr.getAllResponseHeaders()) { xhr.abort(); if (isPageBeingRefreshed) { return; // not an error } } } }); 

Le tecniche di cui sopra non funzionano per una pagina periodicamente aggiornata (ad esempio ogni mezzo secondo). Ho capito che l’errore causato dall’aggiornamento della pagina può essere evitato utilizzando il ritardo del processo di gestione degli errori di una piccola quantità di tempo.

Esempio:

 $.ajax(...) .success(...) .error(function(jqXHR) { setTimeout(function() { // error showing process }, 1000); }); 

In aggiunta a ciò

window.onbeforeunload = function () {// interrompe chiamate ajax}

l’evento può essere utilizzato per le chiamate Ajax meno frequenti.

La versione combinata di nisanth074 e Peter V. Mørch risponde, che ha funzionato per me.

Esempio:

 var isPageBeingRefreshed = false; $(window).on('beforeunload', function(){ isPageBeingRefreshed = true; }); $.ajax({ // Standart AJAX settings }).error(function(){ if (!isPageBeingRefreshed) { // Displaying error message } });