2012-02-10 14 views
30

C'è un modo per gestire l'errore da una richiesta Ajax all'interno di JQuery in modo tale che quando l'utente si allontana dalla pagina, l'errore risultante viene ignorato?Come gestire jQuery ajax errore di post durante la navigazione fuori da una pagina

$(document).ready(function() { 
$.ajax({ 
    url:'/server/url/', 
    type: 'POST', 
    data: {some..data}, 
    success:function(response) { do stuff with response }, 
    error: function(xhr, textStatus, errorThrown) { 
      // Don't raise this alert if user has navigated away from the page 
      alert('error'); 
    } 
}); 

Sono curioso se qualcuno sa di un modo pulito per gestire questo? So che potresti creare un po 'di logica in un metodo $(window).bind("beforeunload", function(){}) ma preferirei se ci fosse un modo per gestire la situazione senza fare ciò poiché Chrome non sembra più supportarlo. C'è per esempio un errore specifico che viene restituito in questo caso?

Grazie.

+0

Dal momento che la chiamata è al server, non penso che sarebbe abbastanza conoscenza per restituire una risposta in modo diverso a seconda che l'utente abbia navigato fuori da quella pagina oppure no. C'è un posto dove puoi fornire un esempio di questo comportamento? Sembra strano che uno script di un'altra pagina continui a essere eseguito dopo che hai navigato fuori da quella pagina. –

+0

I * think * lo script smette di funzionare e viene generato un errore poiché viene interrotto prematuramente. –

+0

Una volta che si allontana, la chiamata AJAX entra nel bit-bucket. Non c'è più un listener sul client per ricevere alcun messaggio da quella richiesta. –

risposta

16

Sembra che la risposta a questo è quello di esaminare il jqXHR.status. Il XMLHttpRequest spec delinea seguente procedura per impostare lo stato:

The status attribute must return the result of running these steps:

  1. If the state is UNSENT or OPENED, return 0 and terminate these steps.

  2. If the error flag is set, return 0 and terminate these steps.

  3. Return the HTTP status code.1

NOTA anche: il flag di errore indica un certo tipo di errore di rete o richiesta aborto. Inizialmente non è impostato e viene utilizzato durante lo stato DONE.

Da quello che ho capito, pertanto, questo controllo codice dovrebbe risolvere il problema:

if (xhr.status == 0) 
     alert('error'); 

https://web.archive.org/web/20120204040047/http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute

+0

Proprio la risposta che stavo cercando. Vincolare nuovi eventi è eccessivamente ingegneristico. – eighteyes

+5

C'è un modo per distinguere tra il caso in cui qualcuno si allontana dalla pagina e altri problemi di rete (timeout, host non trovato, ecc.)? –

+1

[Questo] (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests) articolo dice che _ dal momento in cui la risposta ritorna, la pagina è stata scaricata e la funzione di callback ha vinto ' esiste più_, quindi come funziona la richiamata dell'errore anche in modo affidabile? – winterlight

2

Ho dovuto gestire questo problema anche un paio di volte.

mi consiglia di legame per l'evento $(window).unload, impostando qualche variabile da qualche parte, come ad esempio nello spazio dei nomi (App.unloading = true) e poi testarlo in callback errore con la sessione.

Vedi http://api.jquery.com/unload/

+0

Questo sembra non funzionare per tutti i browser: http: //code.google.com/p/chromium/issues/detail? id = 4422 –

+2

Vedere http: // StackOverflow .com/questions/1370322/jquery-ajax-fires-error-callback-on-window-unload per approcci alternativi. Forse la combinazione di eventi e flag di scarico con il controllo dello stato potrebbe rivelarsi sufficiente. – ori

11

Verifica dello stato non ha funzionato per me, ma

// Ignore incomplete requests, likely due to navigating away from the page 
if (jqXHR.readyState < 4) { 
    return true; 
} 

nel gestore degli errori (4 essendo DONE).

+1

Sono d'accordo con questo. readyState è la strada giusta da percorrere. – Sebastien

+0

Se il processo del server esiste, il valore jqXHR.readyState sarà 0. Questo dovrebbe in effetti andare alla gestione degli errori poiché non è il caso che l'utente stia navigando. – Lorenz03Tx

+0

Non posso essere d'accordo. Sto usando l'attuale FireFox e jQuery v2.0.0. Quando seguo un collegamento durante una richiesta Ajax, la richiesta Ajax termina con jqXHR.readyState = 4 e jqXHR.status = 404. – Simon

Problemi correlati