Questo è, tragicamente, non è un problema semplice da risolvere. Ma può essere fatto. La risposta sotto è amalgamata da molte diverse risposte SO.
Parte semplice: Conosciuto che la finestra viene distrutta. È possibile utilizzare l'handle di evento onunload
per rilevare questo.
Tricky Parte:
Rilevare se si tratta di un aggiornamento, seguono collegamento o la finestra desiderata evento close. Rimozione di collegamento segue e l'invio di moduli è abbastanza facile:
var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });
$(window).bind('beforeunload', function(eventObject) {
var returnValue = undefined;
if (! inFormOrLink) {
returnValue = "Do you really want to close?";
}
eventObject.returnValue = returnValue;
return returnValue;
});
di soluzione
Controllo event.clientY
o event.clientX
per determinare ciò che è stato cliccato per generare l'evento Povero-man.
function doUnload(){
if (window.event.clientX < 0 && window.event.clientY < 0){
alert("Window closed");
}
else{
alert("Window refreshed");
}
}
asse Y non funziona causa è negativo per i clic sulla finestra vicino pulsanti ricarica o scheda/e positivo quando tasti indicati sono utilizzati per ricaricare (es F5, Ctrl-R, ...) e chiusura della finestra (ad es. Alt-F4). X-Axis non è utile poiché diversi browser hanno posizionamenti di pulsanti diversi. Tuttavia, se sei limitato, eseguire le coordinate dell'evento attraverso una serie di if-els potrebbe essere la soluzione migliore. Attenzione che questo non è certamente affidabile.
Coinvolto Soluzione
(Tratto da Julien Kronegg) Utilizzo di memoria locale di HTML5 e comunicazione AJAX client/server. Avvertenza: questo approccio è limitato ai browser che supportano l'archiviazione locale HTML5.
Sulla tua pagina, aggiungere un onunload
alla finestra per il seguente gestore
function myUnload(event) {
if (window.localStorage) {
// flag the page as being unloading
window.localStorage['myUnloadEventFlag']=new Date().getTime();
}
// notify the server that we want to disconnect the user in a few seconds (I used 5 seconds)
askServerToDisconnectUserInAFewSeconds(); // synchronous AJAX call
}
quindi aggiungere un onloadon
il corpo per il seguente gestore
function myLoad(event) {
if (window.localStorage) {
var t0 = Number(window.localStorage['myUnloadEventFlag']);
if (isNaN(t0)) t0=0;
var t1=new Date().getTime();
var duration=t1-t0;
if (duration<10*1000) {
// less than 10 seconds since the previous Unload event => it's a browser reload (so cancel the disconnection request)
askServerToCancelDisconnectionRequest(); // asynchronous AJAX call
} else {
// last unload event was for a tab/window close => do whatever
}
}
}
Sul server, raccogliere le richieste di disconnessione in un elenco e impostare un thread del timer che ispeziona l'elenco a intervalli regolari (ho utilizzato ogni 20 secondi). Una volta scaduto il timeout della richiesta di disconnessione (ovvero i 5 secondi mancanti), disconnettere l'utente dal server. Se nel frattempo viene ricevuta una cancellazione della richiesta di disconnessione , la richiesta di disconnessione corrispondente di viene rimossa dall'elenco, in modo che l'utente non venga disconnesso.
Questo approccio è applicabile anche se si desidera distinguere tra l'evento di chiusura della scheda/finestra seguito da collegamenti o modulo inviato. Devi solo aggiungere e moduli e in ogni pagina di destinazione link/modulo.
Commenti di chiusura (gioco di parole):
Dal momento che si desidera rimuovere i cookie quando la finestra è chiusa, sto supponendo che sia per impedire loro di essere utilizzati in una sessione futura. Se questo è un presupposto corretto, l'approccio sopra descritto funzionerà bene. Si mantiene il cookie invalido sul server (una volta disconnesso il client), quando il client crea una nuova sessione, il JS invierà il cookie per impostazione predefinita, a quel punto si sa che proviene da una sessione precedente, eliminarlo e facoltativamente fornire un nuovo da impostare sul client.
Provare questa volta: angular.element ($ window) .bind ("beforeunload", methodToCall) – Ved
L'ho provato in .run() ma non sembra funzionare. –
qual è il problema che hai dovuto affrontare con questo codice? – Ved