Newsgroup: it.comp.lang.javascript
Titolo: Sei sicuro di voler uscire

Esiste un evento della chiusura della finestra?
Vorrei far apparire un messaggio confirm del tipo "Sei sicuro di voler
chiudere la finestra?", in modo che cliccando su ok si chiuda, su
annulla no.
Grazie!

qualcosa tipo:
 <script language="javascript">
 function ChiediEchiudi() {
  if (confirm("Sei sicuro di voler chiudere la finestra?")) {
    self.close()
    }
 }
 </script>
<a href="javascript:ChiediEchiudi()">Chiudi</a> 

Luca Restifo ha scritto:

No, no, non ci siamo capiti: io vorrei la finestra di conferma quando
si clicca sulla x in alto a destra :p
Questo perchè bisognerebbe uscire dal sito tramite un mio script che
aggiorna delle statistiche.
Ma dubito si possa :)

 Ma dubito si possa :)
Sì, in effetti mi pare che non sia possibile. Cioè, l'evento di chiusura
del browser può essere intercettato ma non bloccato (e meno male!). Esiste,
infatti, l'evento *onunload* allo scatenarsi del quale puoi far svolgere
delle azioni:
window.onunload = function() {
  // Azioni da svolgersi prima
  // della chiusura della finestra
}
Nel tuo caso, puoi inviare al server dei dati usando XmlHttpRequest oppure
(e nel tuo caso è probabilmente preferibile) tramite un'immagine fittizia:
window.onunload = function() {
  var i = new Image()
  i.src = "statistiche.asp" // l'url della pagina delle statistiche
  i = null;
}
In questo modo, quando viene eseguita l'istruzione i.src = "...", di fatto
verrà eseguito, sul server, lo script statistiche.asp (o statistiche.php o
quello che vuoi). Puoi ovviamente passare dei parametri allo script
mediante la query string:
i.src="statistiche.asp?x=3&topolino=spocchia"
-- 
Nando [?]
Apostolo della Prova

 del browser può essere intercettato ma non bloccato (e meno male!).
C'è l'onbeforeunload. E' proprietario di Microsoft, ma è stato
implementato successivamente anche da altri browser. Quelli basati su
Gecko, ad esempio.
-- 
"Se c'è qualcosa di più importante del mio ego su questa nave,
la voglio catturata e fucilata."

 Gecko, ad esempio.
E cosa cambia con l'onunload? Che teoricamente potrei costringere un utente 
a restare a vita su una pagina? :-)
rob4you 

 a restare a vita su una pagina? :-)
No, perché la libera scelta dell'utente è imprescindibile.
Ma, a differenza dell'onunload, che puoi solo gestire in modo passivo,
nell'onbeforeunload puoi avvertire l'utente delle conseguenze della
chiusura della finestra e dargli la possibilità di scegliere se
continuare con l'azione intrapresa o annullarla.


 continuare con l'azione intrapresa o annullarla.
Appunto....con un return false teoricamente l'utente resterebbe a vita nella 
pagina?
rob4you 

rob4you ha scritto:

Ma resta comunque una sua scelta.
Certo che se tu restituisci sempre falso, beh, chiudo da task manager e
non ci torno più su quel sito :P
Grazie comunque, gentilissimi




Ti sfugge probabilmente il senso della frase "puoi avvertire l'utente delle
conseguenze della chiusura della pagina e dargli la possibilità di
scegliere".
Nell'onbeforeunload ciò che puoi fare è *solo* quello. Non puoi cancellare a
priori l'evento, senza alcun tipo di messaggio, e quindi far rimanere
l'utente a tempo indefinito sulla pagina.
Spero di essere stato più chiaro, adesso.
In ogni caso, ti conviene provare ad usare il suddetto evento, per renderti
conto di come funziona.
-- 
~ "When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

 conto di come funziona.
Hai perfettamente ragione....ho fatto delle prove, capito il funzionamento.
Ho notato tra l'altro che, nell'onbeforeunload, il messaggio visualizzato, 
oltre a chiederti se restare o partire, ti riporta il return che si è 
impostato, e non sono possibili "manipolazioni maligne" maggiori.
rob4you 

 Gecko, ad esempio.
Non lo sapevo: non ho mai prestato attenzione l'onbeforeunload perché
pensavo funzionasse solo su IE. Grazie per la dritta, potrebbe tornare
utile in futuro :)


 pensavo funzionasse solo su IE. 
Ti capisco. Anche io me ne sono accorto relativamente tardi:
http://groups.google.it/group/it.comp.lang.javascript/msg/b8f21c00a3f6b531
