2009-05-04 19 views
89

Come evitare che una pagina Web si allontani utilizzando JavaScript?Impedire a una pagina web di allontanarsi utilizzando JavaScript

+0

Ciò che rende questa pagina uscire? – Niyaz

+6

Secondo la domanda, JavaScript lo fa allontanare ... – Shog9

+0

Possibile duplicato di [Come mostrare il "Sei sicuro di voler allontanarti da questa pagina?" quando vengono apportate modifiche?] (http://stackoverflow.com/questions/1119289/how-to-show-the-are-you-sure-you-want-to-navigate-away-from-this-page-when- ch) –

risposta

107

Utilizzando onunload consente solo di visualizzare i messaggi, ma non interrompe la navigazione (perché è troppo tardi). Tuttavia, è possibile utilizzare onbeforeunload e sarà interrompere la navigazione:

window.onbeforeunload = function() { 
    return "Are you sure you want to navigate away?"; 
} 

Edit: Rimosso confirm() nella dichiarazione ritorno come questo ha causato una finestra di conferma come previsto, ma ha anche mostrato un secondo confermare con il risultato della prima conferma .

+4

Il browser visualizzerà un prompt appropriato. Basta usare 'window.onbeforeunload = function() {return" "; } ' –

+0

Ma non è abbastanza. E i controlli all'interno del modulo? Anche loro lo fanno scattare. – Fandango68

3

Utilizzare onunload.

Per jQuery, credo che questo funziona in questo modo:

$(window).unload(function() { 
    alert("Unloading"); 
    return falseIfYouWantToButBeCareful(); 
}); 
+0

Grazie mille ... –

+0

La restituzione di false non cancellerà lo scaricamento sfortunatamente - l'evento 'download 'si attiva quando l'utente lascia la pagina, diversamente da' beforeunload' che si attiva poco prima (e può essere annullato) – Jimbo

+0

@ altCognito: Mi hai dato una buona idea con falseIfYouWantToButBeCareful() Ora posso evitare il pop-up predefinito dato da IE o FF. Ma per il chrome non funziona. Guardando dentro – user367134

6

Nell'esempio di Ayman restituendo falso si impedisce la finestra del browser/scheda dalla chiusura.

window.onunload = function() { 
    alert('You are trying to leave.'); 
    return false; 
} 
+1

Grazie mille ... –

+1

A meno che il browser non sia Opera, che salta l'evento onunload se la scheda/finestra/programma viene chiusa. – Powerlord

1

Quel messaggio di errore suggerito può duplicare il messaggio di errore che il browser già visualizza. In chrome, i 2 messaggi di errore simili vengono visualizzati uno dopo l'altro nella stessa finestra.

In chrome, il testo visualizzato dopo il messaggio personalizzato è: "Sei sicuro di voler lasciare questa pagina?". In firefox, non mostra affatto il nostro messaggio di errore personalizzato (ma visualizza comunque la finestra di dialogo).

Un messaggio di errore più appropriata potrebbe essere:

window.onbeforeunload = function() { 
    return "If you leave this page, you will lose any unsaved changes."; 
} 

o lo stile StackOverflow: "Hai iniziato a scrivere o modificare un post."

18

A differenza di altri metodi presentati qui, questo bit di codice sarà non perché il browser visualizzi un avviso che chiede all'utente se desidera andarsene; invece, sfrutta la natura evented del DOM per reindirizzare nuovamente alla pagina corrente (e quindi annullare la navigazione) prima che il browser abbia la possibilità di scaricarlo dalla memoria.

Poiché funziona cortocircuitando la navigazione direttamente, non può essere utilizzato per impedire che la pagina venga chiusa; tuttavia, può essere usato per disabilitare il frame-busting.

(function() { 
    var location = window.document.location; 

    var preventNavigation = function() { 
     var originalHashValue = location.hash; 

     window.setTimeout(function() { 
      location.hash = 'preventNavigation' + ~~ (9999 * Math.random()); 
      location.hash = originalHashValue; 
     }, 0); 
    }; 

    window.addEventListener('beforeunload', preventNavigation, false); 
    window.addEventListener('unload', preventNavigation, false); 
})(); 

Diniego: Non si dovrebbe mai fare questo. Se su una pagina è presente un codice per il frame-frame, si prega di rispettare i desideri dell'autore.

+0

come mostrare la modal se l'utente vuole chiudere il browser (clicca su chiudi)? veramente? –

11

Ho finito con questa versione leggermente diversa:

var dirty = false; 
window.onbeforeunload = function() { 
    return dirty ? "If you leave this page you will lose your unsaved changes." : null; 
} 

Altrove ho impostato il flag dirty true quando il modulo viene sporcato (o, diversamente, non vuole impedire la navigazione di distanza). Questo mi consente di controllare facilmente se l'utente riceve o meno il prompt di conferma di navigazione.

Con il testo nella risposta selezionato si vede istruzioni ridondanti:

enter image description here

+0

In IE se dirty è false, verrà mostrata una stringa "null". Basta avvolgerlo in una dichiarazione if. Vedi: http://stackoverflow.com/questions/11793996/onbeforeunload-handler-says-null-in-ie –

3

L'equivalente alla risposta accettata in jQuery 1.11:

$(window).on("beforeunload", function() { 
    return "Please don't leave me!"; 
}); 

JSFiddle example

risposta di altCognito usato l'evento unload, che avviene troppo tardi perché JavaScript possa interrompere la navigazione zione.

2

L'equivalente in un modo più moderno e compatibile con browser, utilizzando le moderne API addEventListener.

window.addEventListener("beforeunload", function (e) { 
    var confirmationMessage = "\o/"; 

    e.returnValue = confirmationMessage;  // Gecko and Trident 
    return confirmationMessage;    // Gecko and WebKit 
}); 

Fonte: https://developer.mozilla.org/en-US/docs/Web/Events/beforeunload

+0

Questa è una buona soluzione. –

Problemi correlati