Eseguire il codice JavaScript alla chiusura della finestra o all'aggiornamento della pagina?


110

C'è un modo per eseguire un codice JavaScript finale quando un utente chiude una finestra del browser o aggiorna la pagina?

Sto pensando a qualcosa di simile a onload ma più simile a onclose? Grazie.

Non mi piace il metodo onbeforeunload, che cede sempre alla comparsa di una finestra di conferma (lascia la pagina / resta su mozilla) o (ricarica / non ricaricare su chrome). C'è un modo per eseguire il codice in silenzio?




18
Aspetta- questo in realtà NON È un duplicato ... Vuole sapere come eseguire qualcosa SENZA un prompt all'utente- le domande collegate fanno il contrario ...
Phildo

Risposte:


86

Esistono sia window.onbeforeunloade window.onunload, che vengono utilizzati in modo diverso a seconda del browser. Puoi assegnarli impostando le proprietà della finestra su functions, o usando .addEventListener:

window.onbeforeunload = function(){
   // Do something
}
// OR
window.addEventListener("beforeunload", function(e){
   // Do something
}, false);

Di solito, onbeforeunloadviene utilizzato se è necessario impedire all'utente di lasciare la pagina (es. L'utente sta lavorando su alcuni dati non salvati, quindi deve salvarli prima di uscire). onunloadnon è supportato da Opera , per quanto ne so, ma puoi sempre impostare entrambi.


Questo ha funzionato per me: Firefox (69.0.2) e Chrome (77.0.3865.90)
FelipeCaparelli

51

Ok, ho trovato una soluzione funzionante per questo, consiste nell'usare l' beforeunloadevento e poi far tornare l'handler null. Questo esegue il codice desiderato senza che venga visualizzata una finestra di conferma. Va più o meno così:

window.onbeforeunload = closingCode;
function closingCode(){
   // do something...
   return null;
}

Spero che questo ti aiuti.


10
Non viene attivato anche durante la navigazione e durante l'aggiornamento (F5)? Se è così, non affronta realmente la domanda ...
Jago

1
Non testato, ma penso che return false;faccia lo stesso (cioè impedisce il comportamento predefinito) ed è semanticamente più corretto.
collimarco

1
return false farà comunque apparire la finestra di dialogo chiedendoti se vuoi lasciare la pagina o meno. L'ho provato su un'ancora. Con return null la finestra di dialogo non si apriva, ma appariva ancora su console.log
Ricky Stam

20

A volte potresti voler far sapere al server che l'utente sta abbandonando la pagina. Ciò è utile, ad esempio, per ripulire le immagini non salvate memorizzate temporaneamente sul server, per contrassegnare quell'utente come "offline" o per registrare quando ha terminato la sua sessione.

Storicamente, invieresti una richiesta AJAX nella beforeunloadfunzione, tuttavia questo ha due problemi. Se invii una richiesta asincrona, non vi è alcuna garanzia che la richiesta venga eseguita correttamente. Se invii una richiesta sincrona, è più affidabile, ma il browser si bloccherà fino al termine della richiesta. Se questa è una richiesta lenta, questo sarebbe un enorme inconveniente per l'utente.

Fortunatamente, ora abbiamo navigator.sendBeacon(). Utilizzando il sendBeacon()metodo, i dati vengono trasmessi in modo asincrono al server web quando lo User Agent ha la possibilità di farlo, senza ritardare lo scaricamento o influenzare le prestazioni della navigazione successiva. Ciò risolve tutti i problemi con l'invio dei dati di analisi: i dati vengono inviati in modo affidabile, vengono inviati in modo asincrono e non influisce sul caricamento della pagina successiva. Ecco un esempio del suo utilizzo:

window.addEventListener("unload", logData, false);

function logData() {
  navigator.sendBeacon("/log.php", analyticsData);
}

sendBeacon()è supportato in:

  • Bordo 14
  • Firefox 31
  • Chrome 39
  • Safari 11.1
  • Opera 26
  • iOS Safari 11.4

NON è attualmente supportato in:

  • Internet Explorer
  • Opera Mini

Ecco un polyfill per sendBeacon () nel caso in cui sia necessario aggiungere il supporto per i browser non supportati. Se il metodo non è disponibile nel browser, invierà invece una richiesta AJAX sincrona.


Questa domanda rientrava nell'ambito di un caso "Per inviare una richiesta al server". L'idea era quella di essere in grado di mantenere le schede sulle schede aperte per utente e di ripulire il backend quando una scheda viene chiusa.
Peter,

@Peter lo stavo includendo per completezza, ma l'ho cancellato.
Mike

@ Mike, per favore, NON cancellare la tua risposta. Non solo completa la risposta migliore selezionata (dovrebbe essere la tua) ma presenta anche l'evento utilizzato per catturare l'uscita o la chiusura della finestra
Alex8752

@ Alex8752 Non ho cancellato la mia risposta, ne ho modificato una parte irrilevante per la domanda, che puoi visualizzare qui .
Mike

1
@AshokKumar Hai il controllo di ciò che invii al server. Se vuoi inviare cose tramite GET, non c'è nulla che ti impedisca di inviare la tua richiesta a qualcosa come l' http://example.com/script.php?token=something&var1=val1&var2=val2inserimento di quei valori in GET.
Mike

14

Versione jQuery:

$(window).unload(function(){
    // Do Something
});

Aggiornamento : jQuery 3:

$(window).on("unload", function(e) {
    // Do Something
});

Grazie Garrett


8

La documentazione qui incoraggia l'ascolto dell'evento onbeforeunload e / o l'aggiunta di un listener di eventi sulla finestra.

window.addEventListener('beforeunload', function(event) {
  //do something here
}, false);

Puoi anche popolare le proprietà .onunload o .onbeforeunload della finestra con una funzione o un riferimento alla funzione.

Sebbene il comportamento non sia standardizzato nei browser, la funzione potrebbe restituire un valore che il browser visualizzerà quando confermerà se lasciare la pagina.


7

Puoi usare window.onbeforeunload.

window.onbeforeunload = confirmExit;
function confirmExit(){
    alert("confirm exit is being called");
    return false;
}

3

L'evento viene chiamato beforeunload, quindi puoi assegnare una funzione a window.onbeforeunload.


-2

Puoi provare qualcosa di simile:

<SCRIPT language="JavaScript">
<!--
function loadOut()
{
window.location="http://www.google.com";
}
//-->
</SCRIPT>

<body onBeforeUnload="loadOut()">

23
Fai attenzione, le persone che leggono questo in tempi non antichi: questo è JS e HTML antichi e gli altri suggerimenti qui sono molto migliori.
RAnders00
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.