2010-02-09 16 views
36

È possibile impedire agli utenti di chiudere la finestra utilizzando il pulsante di uscita [X]? In realtà sto fornendo un pulsante di chiusura nella pagina per gli utenti per chiudere la finestra. Fondamentalmente quello che sto cercando di fare è costringere gli utenti a compilare il modulo e inviarlo. Non voglio che chiudano la finestra finché non lo hanno inviato .come impedire agli utenti di chiudere una finestra in javascript?

ragazzi ho davvero apprezzato i vostri commenti, non sto pensando di ospitare su qualsiasi sito web commerciale.è una cosa interna, stiamo effettivamente ricevendo tutto lo staff per partecipare a questo sondaggio che abbiamo progettato .... so che non è nel modo giusto ma mi chiedevo se ci fosse una soluzione al problema che abbiamo qui ...

+42

Grazie a Dio la risposta è no. –

+13

Caro Dio, spero che non sia effettivamente possibile. – FrustratedWithFormsDesigner

+6

Non voglio che la mia finestra provi a costringermi a inviare un modulo. Uccidere il processo del browser è un modo con cui non si è in grado di fare javascript – Natrium

risposta

69

Dai uno sguardo allo onBeforeUnload.

Non costringerà qualcuno a rimanere, ma chiederà loro se vogliono davvero andarsene, che è probabilmente la migliore soluzione per browser incrociati che è possibile gestire. (Simile a questo sito se si tenta di lasciare metà risposta.)

<script language="JavaScript"> 
    window.onbeforeunload = confirmExit; 
    function confirmExit() { 
     return "You have attempted to leave this page. Are you sure?"; 
    } 
</script> 

Edit: La maggior parte dei browser non consentono più di un messaggio personalizzato per onbeforeunload.

Vai a questa bug report dal 18 febbraio 2016.

dialoghi onbeforeunload vengono utilizzati per due cose sul Web moderno:
1. impedendo agli utenti di dati inavvertitamente perdere.
2. Scamming utenti.

Nel tentativo di limitare il loro utilizzo per quest'ultimo senza arrestare il primo, non visualizzeremo la stringa fornita dalla pagina web.Invece, useremo una stringa generica.

Firefox già fa questo [...]

+6

Ora non è così male! – FrustratedWithFormsDesigner

+1

Questo non funzionerà in Opera, in quanto non si attiva sugli eventi onbeforeunload. –

+14

* scuote il pugno * a Opera. – Pool

0

Bene, è possibile utilizzare l'evento window.onclose e restituire false nel gestore eventi.

function closedWin() { 
    confirm("close ?"); 
    return false; /* which will not allow to close the window */ 
} 
if(window.addEventListener) { 
    window.addEventListener("close", closedWin, false); 
} 

window.onclose = closedWin; 

Il codice è stato preso da this site.

D'altra parte, se impongono la chiusura (utilizzando il task manager o qualcosa in quelle linee) non si può fare nulla al riguardo.

+0

Non credo che questo funzioni più con molti browser. –

+2

Se * funziona *, lo chiamerei un bug nel browser. –

8

Cosa farai quando un utente preme ALT + F4 o chiude da Task Manager

Perché non tenere traccia se non hanno completato in un biscotto o il DB e quando visitare la prossima volta basta riportare lo stesso schermo ...: BTW ... non hai finito di compilare questo modulo ... "

Ovviamente se eri in giro prima del busto delle dotcom ricordavi le tempeste del porno, dove se hai chiuso 1 finestra 15 altri si aprono..so sì c'è il codice che rileverà una finestra di chiusura ma se premi ALT + F4 due volte chiuderà il bambino e il genitore (se era un popup)

+1

Prima di tutto, ovviamente questo tipo di "funzionalità" non dovrebbe essere abusato. C'è sempre la possibilità che l'azione che deve essere confermata/differita sia critica e/o sensibile al tempo. Ad esempio, banking online. Invio una transazione "billpay" per un pagamento che deve essere avviato oggi. Mi viene mostrata una pagina di revisione/conferma in cui posso modificare, confermare o cancellare. Passo a un'altra scheda del browser e chiudo inavvertitamente il browser. Mi serve la pagina bancaria da mostrare e fammi sapere che è necessaria la conferma. Aspettare fino alla prossima settimana quando apro di nuovo bill bill non è l'ideale. –

1

È una pratica scorretta forzare l'utente a fare qualcosa che non necessariamente vuole fare. Non puoi mai davvero impedire loro di chiudere il browser.

È possibile ottenere un effetto simile, tuttavia, creando un div nella pagina Web corrente per sovrapporre il resto dei controlli in modo che il modulo sia l'unica cosa accessibile.

+4

Ugh che è anche estremamente fastidioso. È un ottimo modo per assicurarmi che non torni su un sito. – FrustratedWithFormsDesigner

+1

È fastidioso, sono d'accordo. Ma è meglio che costringermi a chiudere il browser con un task manager. Ho appena chiuso la scheda fastidiosa, invece. –

2

Questo farà apparire una finestra di dialogo che chiede all'utente se vuole veramente chiudere o rimanere, con un messaggio.

var message = "You have not filled out the form."; 
window.onbeforeunload = function(event) { 
    var e = e || window.event; 
    if (e) { 
     e.returnValue = message; 
    } 
    return message; 
}; 

È possibile quindi Annulla, prima che il modulo venga presentata o qualcos'altro con

window.onbeforeunload = null; 

Tenete a mente che questo è estremamente fastidioso. Se stai tentando di costringere i tuoi utenti a compilare un modulo che non vogliono compilare, allora fallirai: troveranno un modo per chiudere la finestra e non tornare mai sul tuo sito medio.

2

Se invii un sondaggio interno che richiede il 100% di partecipazione da parte dei dipendenti della tua azienda, un percorso migliore sarebbe semplicemente quello di tenere traccia dell'ID del risponditore/Nome utente/email ecc. Qualche giorno o poco più invia un piccolo promemoria via email a quelli della tua organizzazione per completare il sondaggio ... probabilmente potresti persino automatizzarlo.

+0

Sono abbastanza sicuro che ci sono molti sistemi di indagine pre-costruiti che sono già in grado di questo (non sono sicuro che siano molto $$, ma è un altro argomento). – FrustratedWithFormsDesigner

+0

in realtà dipendevamo da questo sistema di sondaggi precostruito, ma si è dimostrato essere inutile ... quindi pensavo a un modo più semplice di farlo, ma comunque grazie per i vostri commenti .... – manraj82

1

Che ne dici?

function internalHandler(e) { 
    return "Please don't leave our page ever!"; 
} 

if (window.addEventListener) { 
    window.addEventListener('beforeunload', internalHandler, true); 
} else if (window.attachEvent) { 
    window.attachEvent('onbeforeunload', internalHandler); 
} 
6

Se non si desidera visualizzare pop-up per tutti gli eventi è possibile aggiungere le condizioni come

window.onbeforeunload = confirmExit; 
    function confirmExit() { 
     if (isAnyTaskInProgress) { 
      return "Some task is in progress. Are you sure, you want to close?"; 
     } 
    } 

Questo funziona bene per me

+1

L'ho provato su IE8, Firefox e Chrome, sta funzionando bene. – Imam

Problemi correlati