jQuery ajaxError () incendi gestore se l'utente lascia pagina prima pagina termine del caricamento

StackOverflow https://stackoverflow.com/questions/1906023

  •  19-09-2019
  •  | 
  •  

Domanda

Usiamo gestore globale di jQuery ajaxError () per avvisare l'utente di eventuali guasti AJAX:

$(document).ajaxError(function() {  
    $("There was a network or server error. Please try again later.").dialog({  
        title: "Error",  
        modal: true,  
        resizable: false,  
        buttons: { 'Ok': function() { (this).dialog("close"); } }  
    });  
});  

Purtroppo, questo gestore errori globale spara anche se l'utente lascia la pagina prima che venga completata carico. Ecco i passaggi per riprodurre l'errore:

  1. L'utente visita Pagina A, che include elementi che caricano tramite la tecnologia AJAX.
  2. elementi AJAX a pagina A iniziano carico.
  3. L'utente fa clic dei collegamenti a visitare la pagina B prima di carico AJAX elementi a pagina A hanno terminato.
  4. La finestra di dialogo di errore appare brevemente prima che il browser reindirizza alla pagina B.

Qualche idea su come possiamo ottenere ajaxError () non innescare quando l'errore è direttamente causato da l'utente che visita una nuova pagina?

UPDATE: Ecco il mio codice ora, dopo che incorpora i suggerimenti nei commenti:

// I added a 3 second delay to our error dialog, enough time
// for the user to leave for a new page:
$(document).ajaxError(function() {
    setTimeout(my_error_handler, 3000);
});

// Warn user before leaving page if AJAX is still loading.
// Not sure I'll keep this:
$(document).ajaxStart(function() {
    ajaxing = true;
});

$(document).ajaxStop(function() {
    ajaxing = false;
});

window.onbeforeunload = function() {
    if (typeof(ajaxing) != 'undefined' && ajaxing) {
        return "Page elements are still loading!";
    }
};
È stato utile?

Soluzione

Ebbene sì, se l'utente passa a un'altra pagina, il XHR sarà abortire, che è, in effetti, una comunicazione senza successo. Una soluzione potrebbe essere quella di registrare un listener per l'evento onbeforeunload, e ajaxError unbind lì, sostanzialmente dicendo:. L'utente è in procinto di lasciare la pagina, in modo da non voglio essere informato degli errori Ajax che possano derivare

Alcuni siti, anche se, come GMail, fanno il contrario: se si prova a navigare lontano dalla pagina mentre ci sono ancora alcune richieste Ajax in sospeso, ti dà un prompt che dice che hai alcuni processi ancora in esecuzione , e consente all'utente di decidere se rimanere sul sito fino a quando la richiesta è finito, o per andare avanti e navigare via.

Altri suggerimenti

In base alla risposta di David Hedlund sopra ecco il codice che funziona per me:

//enable global ajax error handling
$(document).ajaxError(function (event, request, settings) {
    //your error handling code here
});

//user leaving page so ignore any unfinished ajax loads
$(window).bind('beforeunload', function () {
    $(document).unbind('ajaxError');
});

Ho avuto la spec 'ajaxError' dalla sezione commenti di jquery ajaxError documentazione . Ho dovuto legarsi beforeunload a $(window) al fine di sostenere cromo (IE stava lavorando bene con il documento). .ajaxError non è scattato quando sono stato il legame con $(window) quindi questo è il motivo per cui ho questa soluzione finestra / documento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top