Come disabilitare il pulsante INDIETRO del browser (su tutti i browser)?
Come disabilitare il pulsante INDIETRO del browser (su tutti i browser)?
Risposte:
Questa domanda è molto simile a questo uno ...
È necessario forzare la scadenza della cache affinché funzioni. Inserisci il codice seguente nel codice della tua pagina dietro.
Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)
Non disabilitare il comportamento del browser previsto.
Fai in modo che le tue pagine gestiscano la possibilità che gli utenti tornino indietro di una o due pagine; non cercare di paralizzare il loro software.
Ho escogitato un piccolo trucco che disabilita il pulsante Indietro usando JavaScript. L'ho controllato su Chrome 10, Firefox 3.6 e IE9:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<title>Untitled Page</title>
<script type = "text/javascript" >
function changeHashOnLoad() {
window.location.href += "#";
setTimeout("changeHashAgain()", "50");
}
function changeHashAgain() {
window.location.href += "1";
}
var storedHash = window.location.hash;
window.setInterval(function () {
if (window.location.hash != storedHash) {
window.location.hash = storedHash;
}
}, 50);
</script>
</head>
<body onload="changeHashOnLoad(); ">
Try to hit the back button!
</body>
</html>
Cosa sta facendo?
Dai commenti:
Questo script sfrutta il fatto che i browser considerano tutto ciò che viene dopo il segno "#" nell'URL come parte della cronologia di navigazione. Quello che fa è questo: quando la pagina viene caricata, "# 1" viene aggiunto all'URL. Dopo 50 ms l '"1" viene rimosso. Quando l'utente fa clic su "indietro", il browser riporta l'URL a quello che era prima che l '"1" fosse rimosso, MA - è la stessa pagina web, quindi il browser non ha bisogno di ricaricare la pagina. - Yossi Shasho
Altri hanno adottato l'approccio per dire "non farlo", ma questo non risponde veramente alla domanda del poster. Supponiamo solo che tutti sappiano che questa è una cattiva idea, ma siamo curiosi di sapere come sia fatta comunque ...
Non è possibile disabilitare il pulsante Indietro nel browser di un utente, ma è possibile fare in modo che l'applicazione si interrompa (visualizza un messaggio di errore, che richiede all'utente di ricominciare da capo) se l'utente torna indietro.
Un approccio che ho visto per farlo è passare un token su ogni URL all'interno dell'applicazione e all'interno di ogni modulo. Il token viene rigenerato su ogni pagina e, una volta che l'utente carica una nuova pagina, tutti i token delle pagine precedenti vengono invalidati.
Quando l'utente carica una pagina, la pagina verrà visualizzata solo se le è stato passato il token corretto (che è stato dato a tutti i link / moduli nella pagina precedente).
L'applicazione di online banking fornita dalla mia banca è simile a questa. Se utilizzi il pulsante Indietro, non funzioneranno più collegamenti e non sarà più possibile ricaricare la pagina, ma vedrai invece un avviso che ti informa che non puoi tornare indietro e devi ricominciare da capo.
Mentre cerco io stesso la risposta, "Best Practice" è ... obsoleto ... proprio come i browser (i browser sono davvero orribili fossili)
La soluzione migliore / più sicura sarebbe per i browser implementare un metodo / richiesta in cui l'utente può concedere alla pagina la capacità di controllare l'interfaccia.
Perché? Perché per il mio progetto attuale sto costruendo un'interfaccia costruita e controllata al 100% da JavaScript. E i pulsanti Indietro non hanno posto nel mio progetto poiché non c'è cambio di pagina. (Cioè dannatamente veloce e nessuna pagina lampeggia a causa di un aggiornamento .. Proprio come una vera applicazione!)
So perché la capacità di "highjack" l'interfaccia non è presente, e lo capisco. Ma almeno dovremmo avere la possibilità di richiederlo dal browser! Questa sarebbe davvero la "migliore pratica" senza i pericoli dell'highjack.
Ma i browser sono browser .. Non mi aspetto che succeda qualcosa di nuovo a questo proposito.
Stavo cercando la stessa domanda e ho trovato il seguente codice su un sito. Ho pensato di condividerlo qui:
function noBack()
{
window.history.forward()
}
noBack();
window.onload = noBack;
window.onpageshow = function(evt){ if(evt.persisted) noBack(); }
window.onunload = function(){ void(0); }
Tuttavia, come notato dagli utenti sopra, questa non è mai una buona pratica e dovrebbe essere evitata per tutti i motivi.
Se ti affidi alla tecnologia lato client, può essere aggirato. Javascript potrebbe essere disabilitato, ad esempio. Oppure l'utente potrebbe eseguire uno script JS per aggirare le tue restrizioni.
La mia ipotesi è che puoi farlo solo monitorando lato server della sessione utente e reindirizzando (come in Server.Transfer, non Response.Redirect) l'utente / browser alla pagina richiesta.
Ci sono state alcune implementazioni differenti. C'è una soluzione flash e alcune soluzioni iframe / frame per IE. Controlla questo
BTW: Ci sono molti validi motivi per disabilitare (o almeno impedire 1 passaggio) un pulsante Indietro: guarda Gmail come un esempio che implementa la soluzione hash discussa nell'articolo precedente.
Google "come ajax ha rotto il pulsante Indietro" e troverai molti articoli sui test degli utenti e sulla validità della disabilitazione del pulsante Indietro.
Ho anche avuto lo stesso problema, utilizzare questa funzione di script Java sul tag head o in, funziona al 100% bene, non ti lascerei tornare indietro.
<script type = "text/javascript" >
function preventBack(){window.history.forward();}
setTimeout("preventBack()", 0);
window.onunload=function(){null};
</script>
Prova questo codice. Ha funzionato per me. Fondamentalmente cambia l'hash non appena viene caricata la pagina, il che cambia la pagina della cronologia recente aggiungendo "1" all'URL. Quindi, quando premi il pulsante Indietro, reindirizza alla stessa pagina ogni volta.
<script type="text/javascript">
var storedHash = window.location.hash;
function changeHashOnLoad() { window.location.hash = "1";}
window.onhashchange = function () {
window.location.hash = storedHash;
}
</script>
<body onload="changeHashOnLoad(); ">
</bod>
Dovresti utilizzare post con scadenze corrette e intestazioni di memorizzazione nella cache.
Invece di provare a disabilitare il pulsante Indietro del browser è meglio supportarlo. .NET 3.5 può gestire molto bene i pulsanti Indietro (e Avanti) del browser. Cerca con Google: "Scriptmanager EnableHistory". È possibile controllare quali azioni dell'utente aggiungeranno una voce alla cronologia del browser (ScriptManager -> AddHistoryPoint) e l'applicazione ASP.NET riceve un evento ogni volta che l'utente fa clic sui pulsanti Indietro / Avanti del browser. Funzionerà con tutti i browser conosciuti
A livello globale, disabilitare il pulsante Indietro è davvero una cattiva pratica. Tuttavia, in determinate situazioni, la funzionalità del pulsante Indietro non ha senso.
Ecco un modo per impedire la navigazione indesiderata tra le pagine:
Pagina principale (file top.php):
<?php
session_start();
$_SESSION[pid]++;
echo "top page $_SESSION[pid]";
echo "<BR><a href='secondary.php?pid=$_SESSION[pid]'>secondary page</a>";
?>
Pagina secondaria (file secondary.php):
<?php
session_start();
if ($_SESSION[pid] != $_GET[pid])
header("location: top.php");
else {
echo "secondary page $_SESSION[pid]";
echo "<BR><a href='top.php'>top</a>";
}
?>
L'effetto è quello di consentire la navigazione dalla pagina principale in avanti alla pagina secondaria e viceversa (es. Annulla) utilizzando i propri collegamenti. Tuttavia, dopo essere tornati alla pagina principale, al pulsante Indietro del browser viene impedito di navigare alla pagina secondaria.
Anche io ho affrontato la stessa situazione prima ... e non ho avuto alcun aiuto. prova queste cose forse queste funzioneranno per te
nel <head>tag della pagina di accesso :
<script type="text/javascript">
window.history.forward();
</script>
nel pulsante Logout ho fatto questo:
protected void Btn_Logout_Click(object sender, EventArgs e)
{
connObj.Close();
Session.Abandon();
Session.RemoveAll();
Session.Clear();
HttpContext.Current.Session.Abandon();
}
e nella pagina di accesso ho messo l'accento sulla casella di testo del nome utente in questo modo:
protected void Page_Load(object sender, EventArgs e)
{
_txtUsername.Focus();
}
spero che questo aiuti ... :) qualcuno per favore mi insegni come modificare questa pagina ...
Se devi sopprimere delicatamente i tasti Canc e Backspace nella tua app Web, in modo che quando stanno modificando / eliminando elementi la pagina non venga reindirizzata in modo imprevisto, puoi utilizzare questo codice:
window.addEventListener('keydown', function(e) {
var key = e.keyCode || e.which;
if (key == 8 /*BACKSPACE*/ || key == 46/*DELETE*/) {
var len=window.location.href.length;
if(window.location.href[len-1]!='#') window.location.href += "#";
}
},false);
Prova questo codice. Devi solo implementare questo codice nella pagina master e funzionerà per te su tutte le pagine
<script type="text/javascript">
window.onload = function () {
noBack();
}
function noBack() {
window.history.forward();
}
</script>
<body onpageshow="if (event.persisted) noBack();">
</body>
Il problema con Yossi Shasho codice s' è che la pagina scorre verso l'alto ogni 50 ms. Quindi ho modificato quel codice. Ora funziona bene su tutti i browser moderni, IE8 e versioni successive
var storedHash = window.location.hash;
function changeHashOnLoad() {
window.location.href += "#";
setTimeout("changeHashAgain()", "50");
}
function changeHashAgain() {
window.location.href += "1";
}
function restoreHash() {
if (window.location.hash != storedHash) {
window.location.hash = storedHash;
}
}
if (window.addEventListener) {
window.addEventListener("hashchange", function () {
restoreHash();
}, false);
}
else if (window.attachEvent) {
window.attachEvent("onhashchange", function () {
restoreHash();
});
}
$(window).load(function () { changeHashOnLoad(); });