2013-10-09 13 views
5

Nella mia applicazione, c'è un oggetto che deve essere restituito al server prima che l'utente passi a un'altra pagina o chiuda il browser.facendo una chiamata ajax su window.unload

Per il momento, sto usando qualcosa di simile:

$(window).on('unload', function() { 
    $.ajax(....);  
}); 

Sarà il fuoco ajax chiamata in tutti i browser o ci sono situazioni in cui questo non funziona e dove questa situazione deve essere gestita in modo diverso? Non ho bisogno di trattare nulla in termini di una funzione di successo, sono solo preoccupato per le informazioni che lo rendono al server.

Grazie.

+1

Non è possibile fare affidamento su un evento di "scarico" generato prima che una pagina scompaia. Sarà fatto dal browser in * normali * circostanze, ma non quando il browser non può fare nulla al riguardo (arresto improvviso del sistema, ad esempio). – Pointy

+0

Non puoi fare affidamento su nulla da quel logi ... * tira la corda dell'alimentazione * –

risposta

3

Se stai usando jQuery, è possibile impostare async su false nella chiamata ajax. E potrebbe funzionare, ma i risultati potrebbero variare a seconda del browser. Ecco un esempio di jsFiddle. http://jsfiddle.net/jtaylor/wRkZr/4/

// Note: I came across a couple articles saying we may should to use window.onbeforeunload instead of or in addition to jQuery's unload. Keep an eye on this. 
//  http://vidasp.net/jQuery-unload.html 
//  https://stackoverflow.com/questions/1802930/setting-onbeforeunload-on-body-element-in-chrome-and-ie-using-jquery 

var doAjaxBeforeUnloadEnabled = true; // We hook into window.onbeforeunload and bind some jQuery events to confirmBeforeUnload. This variable is used to prevent us from showing both messages during a single event. 


var doAjaxBeforeUnload = function (evt) { 
    if (!doAjaxBeforeUnloadEnabled) { 
     return; 
    } 
    doAjaxBeforeUnloadEnabled = false; 
    jQuery.ajax({ 
     url: "/", 
     success: function (a) { 
      console.debug("Ajax call finished"); 
     }, 
     async: false /* Not recommended. This is the dangerous part. Your mileage may vary. */ 
    }); 
} 

$(document).ready(function() { 
    window.onbeforeunload = doAjaxBeforeUnload; 
    $(window).unload(doAjaxBeforeUnload); 
}); 

In Google Chrome, la chiamata AJAX completa sempre prima di navigare lontano dalla pagina.

Tuttavia, NON AVREBBE MOLTO RACCOMANDATO di seguire questa rotta. La "a" di ajax è per "asincrona", e se cerchi di forzarti ad agire come una chiamata sincrona, stai cercando dei problemi. Questo problema si manifesta generalmente come il congelamento del browser, cosa che potrebbe accadere se la chiamata ajax richiedesse molto tempo.

Se possibile, è consigliabile chiedere all'utente prima di allontanarsi dalla pagina se la pagina contiene dati che devono essere inviati tramite ajax. Per un esempio, vedere questa domanda: jquery prompt to save data onbeforeunload

1

No, sfortunatamente la chiamata Ajax non verrà completata poiché il documento verrà scaricato durante la chiamata asincrona. Non puoi fare molte cose quando l'utente chiude la finestra.

0

È necessario utilizzare l'evento onbeforeunload e effettuare una chiamata AJAX sincrona.

$.ajax({ 
    ... 
    "url": "http://www.example.com", 
    "async": false, 
    ... 
}); 
0

Invece di fare una chiamata AJAX sincronizzazione (deprecato il browser più recenti e può ottenere eccezione), è possibile aprire un popup:

$(window).on('unload', function() { 
    window.open("myscript.php"); 
}); 

È possibile aggiungere, ovviamente, i parametri di il collegamento e puoi chiudere automaticamente il popup se lo desideri. Blocco popup deve essere disattivato per il tuo dominio nelle opzioni del browser.