Disattiva il pulsante Indietro del browser


98

Come disabilitare il pulsante INDIETRO del browser (su tutti i browser)?


92
Non possiedi i computer dei tuoi utenti o i loro browser.
Instance Hunter

47
+1 Perché anche se sono d'accordo sul fatto che disabilitare il pulsante Indietro del browser sia "cattiva pratica", non vedo alcun motivo per sottoporre a downvoting la domanda stessa, rispondendo e spiegando perché è la strada da percorrere.
ChristopheD

45
Perché siamo ostili a questa domanda? Per quanto ne sappiamo, la persona che pone questa domanda sa già che questa è una pratica di scarsa usabilità, ma sta solo seguendo i requisiti, o forse vuole solo imparare qualcosa. Perché non facciamo finta che questa sia una domanda ipotetica e rispondiamo come lo faremmo SE dovessimo fare quel genere di cose?
thomasrutter

5
Alcune cose non dovrebbero mai essere fatte, indipendentemente dal desiderio di farle. Avere un requisito non negoziabile per questo significa immediatamente che i requisiti sono stati stabiliti da persone senza che siano stati impostati da un'azienda, il che è un problema molto più grande.
annakata

37
ugh, ho scritto il commento più fantastico di sempre, ma l'ho perso quando ho premuto accidentalmente il pulsante Indietro.
Dan Williams

Risposte:


26

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)

14
Si noti che rendere la pagina non memorizzabile nella cache non ottiene ciò che l'OP voleva: disabilitare le pagine in visita utilizzando il pulsante Indietro. Anche se un browser non obbedisce alla cache quando si utilizza il pulsante Indietro (che i browser non sono obbligati a fare per quanto ne so) forniscono comunque un modo per ricaricare quella pagina (di solito dopo aver mostrato una finestra di dialogo di avviso). Quindi, se davvero non vuoi che i tuoi utenti tornino a quella pagina, questo potrebbe essere peggio, dal momento che la richiesta di quella pagina DOVRA 'arrivare fino al server di origine. Avrai bisogno di qualcosa lato server per rilevare che la pagina è stata rivista. Le intestazioni possono essere ignorate.
thomasrutter

60

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.


6
Grazie amico, il fatto è che se stai realizzando un'app AJAX, il compromesso costo-beneficio tra disabilitare il pulsante Indietro o passare attraverso la tua app e elaborare l'azione di ritorno appropriata per ogni possibile scenario, può tendere alla disabilitazione il pulsante Indietro è l'opzione più attraente delle due.
david.barkhuizen,

Sono d'accordo con Jonathan, soprattutto con il flusso di annunci di malware di reindirizzamento che stanno attualmente invadendo Internet, che già abusano del sistema di avviso per rendere difficile lasciare le loro pagine senza dare loro la possibilità di
bloccarti

46

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


1
Sembra che questo script aggiunga "#" all'URL quando la pagina viene caricata e ogni 50 ms aggiunge un 1 all'URL.
ceneri999

6
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

1
nota che l'URL cambia due volte: lo facciamo solo per mascherare l'implementazione, quindi nessuno vedrà che abbiamo aggiunto "1". Quindi, in realtà, quando l'utente fa clic di nuovo, la pagina aggiunge nuovamente il "n. 1" per un momento e lo rimuove di nuovo. BTW - non deve essere "1", può essere qualsiasi stringa.
Yossi Shasho

2
Il problema con questo è che la pagina scorre verso l'alto ogni 50 ms. Se hai un modulo più grande dell'altezza della finestra, questo renderà impossibile riempire i valori del modulo.
3komma14

Grazie mille. Questo è molto utile per una pagina particolarmente interattiva basata su JavaScript che ho, dove lo scorrimento a sinistra ea destra fa parte della meccanica. Questo aiuta ad eliminare il problema del gesto di scorrimento su Mac OS X che riporta gli utenti "indietro" di una pagina per sbaglio (tutto è facile se sono già stati fatti scorrere completamente).
Iain Collins

34

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.


1
La mia banca ha un approccio diverso: termina completamente la sessione. L'utilizzo del pulsante Indietro equivale a disconnettersi.
RobG

Sembra lo stesso approccio. Stanno rilevando che sei tornato indietro e hai generato una condizione di errore.
thomasrutter

anche joomla funziona intorno alla soluzione del token, un token viene generato da ogni pagina e ogni form, infatti ci sono alcuni problemi su questa pratica, come "quando un utente rimane troppo su una pagina e il suo token scade"
Matteo Bononi 'peorthyr'

1
Non fraintendetemi, ci sono MOLTI problemi con questa pratica. Non lo sto raccomandando, sto solo dicendo come viene normalmente raggiunto. Passano token univoci tra le pagine per rilevare che non hai seguito uno dei collegamenti previsti dalla pagina precedente, quindi terminare la sessione o mostrare un errore. Rompe il pulsante Indietro, interrompe la navigazione a schede, interrompe il bookmarking e / o la condivisione dei collegamenti e altro ancora, e per di più, non risolve davvero alcun problema.
thomasrutter

se il problema è che le informazioni vengono perse o si interrompono già se l'utente prova a utilizzare il pulsante Indietro, disabilitare il pulsante Indietro sarebbe un approccio più desiderato.
PoloHoleSet

10

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.


1
100% in disaccordo, mentre questa funzionalità sarebbe meravigliosa per il 99% degli sviluppatori web, il che lascia il restante 1% che abuserebbe di questa funzionalità, secondo me è troppo pericoloso consentire a un sito web di controllare la tua capacità di usare Internet lo script di reindirizzamento interdominio deve essere escluso o consentire a di confermare se lo script può essere eseguito proprio a causa di questo tipo di abuso
MikeT

@MikeT - In che modo disabilitare un pulsante "Indietro" durante la navigazione nelle pagine delle mie applicazioni specifiche inibirebbe la capacità di chiunque di utilizzare Internet?
PoloHoleSet

@PoloHoleSet se hai la possibilità di disabilitare il pulsante Indietro del browser, lo fanno anche tutti, tutto ciò di cui hai bisogno è un reindirizzamento per inviarti a una pagina a cui non volevi andare e se possono disabilitare i controlli di navigazione nel browser come scappi? Sono sicuro che ti sei imbattuto nella pagina "hai un virus" dove ti chiedono di installare il loro virus per rimuovere il virus inesistente ora immagina quel sito dove possono effettivamente impedirti di
andartene

@MikeT - Posso inserire qualsiasi altro URL nella finestra di navigazione, posso chiudere una scheda, posso disabilitare javascript. Il punto non è se qualcuno PU, perché tu puoi, io posso, chiunque può. Per una questione di politica, le persone dicono che NON DOVRESTI, se puoi. Non stiamo parlando di come progetteremmo un browser, stiamo parlando di come programmiamo un'applicazione.
PoloHoleSet

@PoloHoleSet se hai intenzione di bloccare la navigazione, dovrai bloccare più del semplice pulsante Indietro, poiché la cronologia del browser e gli URL digitati fornirebbero agli utenti anche un modo per bypassare il flusso di lavoro. e come ho detto non stiamo parlando di ciò che voi o io faremmo ma dell'elemento dannoso, se l'unico modo per impedire a un sito Web dannoso di prendere il controllo del vostro browser è disabilitare tutti i js sul vostro browser, allora avete rotto Internet come il Web moderno fa affidamento sugli script per fornire contenuti, il che è il mio punto di vista, se desideri un controllo così ampio sui tuoi utenti crea un'app per servire il tuo flusso di lavoro
MikeT

4

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.


2
sarebbe bene se potessi indicare i motivi per cui dovrebbe essere evitato.
Chris Snow

Secondo la mia comprensione, tecnicamente non puoi disabilitare il pulsante Indietro sul browser di qualcuno, puoi solo farlo in modo che il pulsante non sia disponibile o continui a caricare la stessa pagina. Piuttosto che farlo tramite JS, usa il codice lato server e usa la logica appropriata che non ha bisogno di usare il pulsante Indietro. Dovrebbe essere utilizzata un'azione alternativa come ricaricare la stessa pagina o mostrare un messaggio personalizzato.
user704988

2

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.


2
<body onLoad="if(history.length>0)history.go(+1)">

2

Ci sono state alcune implementazioni differenti. C'è una soluzione flash e alcune soluzioni iframe / frame per IE. Controlla questo

http://www.contentwithstyle.co.uk/content/fixing-the-back-button-and-enabling-bookmarking-for-ajax-apps

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.


Dai un'occhiata anche al nuovo visualizzatore di foto di Facebook. Si noti che il pulsante Indietro ti riporta indietro di una foto (che è quella che vuoi) invece di fare il default del browser
DallinDyer

2

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>

1

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>


0

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


0

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.


0

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 ...


a) modifica la tua risposta b) fai clic sul punto interrogativo c) fai clic su guida avanzata d) leggi e applica :-) Nota anche che ctrl-k annulla / fa rientrare il blocco selezionato per / formattare come codice. Inoltre il formattatore non può gestire bene le schede (probabilmente non è un problema qui, però)
kleopatra

0

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);

0

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>

0

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(); });

0

Questo sembra aver funzionato per noi.

history.pushState(null, null, $(location).attr('href'));
window.addEventListener('popstate', function () {
    history.pushState(null, null, $(location).attr('href'));
});

0
<script>
    $(document).ready(function() {
        function disableBack() { window.history.forward() }

        window.onload = disableBack();
        window.onpageshow = function(evt) { if (evt.persisted) disableBack() }
    });
</script>
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.