Désactiver le bouton de retour du navigateur

98

Comment désactiver le bouton RETOUR du navigateur (sur tous les navigateurs)?

priyanka.sarkar
la source
92
Vous ne possédez pas les ordinateurs de vos utilisateurs ou leurs navigateurs.
Instance Hunter
47
+1 Parce que même si je suis d'accord pour dire que désactiver le bouton de retour du navigateur est une «mauvaise pratique», je ne vois aucune raison de voter contre la question elle-même, de répondre et d'expliquer pourquoi est la voie à suivre.
ChristopheD
45
Pourquoi sommes-nous hostiles à cette question? Pour autant que nous sachions, la personne qui pose cette question sait déjà qu'il s'agit d'une mauvaise pratique d'utilisation, mais elle ne fait que suivre les exigences, ou peut-être qu'elle veut simplement apprendre quelque chose. Pourquoi ne pas simplement prétendre que c'est une question hypothétique et répondre comment nous le ferions SI nous devions faire ce genre de chose?
thomasrutter
5
Certaines choses ne devraient jamais être faites, quel que soit le désir de les faire. Le fait d'avoir une exigence non négociable pour cela signifie instantanément que les exigences ont été fixées par des personnes sans entreprise, ce qui est un problème beaucoup plus important.
annakata
37
euh, j'ai rédigé le commentaire le plus génial de tous les temps, mais je l'ai perdu lorsque j'ai accidentellement appuyé sur le bouton de retour.
Dan Williams

Réponses:

26

Cette question est très similaire à celle- ci ...

Vous devez forcer l'expiration du cache pour que cela fonctionne. Placez le code suivant sur votre code de page derrière.

Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)
RSolberg
la source
14
Notez que rendre la page non mise en cache ne permet pas d'obtenir ce que l'OP souhaitait: désactiver les pages de visite à l'aide du bouton Précédent. Même si un navigateur obéit au no-cache lors de l'utilisation du bouton de retour (que les navigateurs ne sont pas obligés de faire AFAIK), ils fournissent toujours un moyen de recharger cette page (généralement après avoir affiché une boîte de dialogue d'avertissement). Donc, si vous ne voulez vraiment pas que vos utilisateurs reviennent sur cette page, cela peut être pire, car la demande pour cette page DOIT arriver jusqu'au serveur d'origine. Vous aurez besoin de quelque chose côté serveur pour détecter que la page a été revisitée. Les en-têtes peuvent être ignorés.
thomasrutter
60

Ne désactivez pas le comportement attendu du navigateur.

Faites en sorte que vos pages gèrent la possibilité que les utilisateurs reviennent d'une page ou deux en arrière; n'essayez pas de paralyser leur logiciel.

Jonathan Fingland
la source
6
Merci mec, le fait est que si vous créez une application AJAX, le compromis coût-avantage entre la désactivation du bouton de retour ou le passage par votre application et l'élaboration de l'action de retour appropriée pour chaque scénario possible, peut avoir tendance à désactiver. le bouton de retour étant l'option la plus attrayante des deux.
david.barkhuizen
Je suis d'accord avec Jonathan, en particulier avec le flot de publicités de redirection de logiciels malveillants qui inondent actuellement Internet, ils abusent déjà du système d'alerte pour rendre leurs pages difficiles sans leur donner la possibilité de vous verrouiller sur leur page
MikeT
46

J'ai trouvé un petit hack qui désactive le bouton de retour en utilisant JavaScript. Je l'ai vérifié sur Chrome 10, Firefox 3.6 et 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>

Qu'est-ce que ça fait?

Des commentaires:

Ce script exploite le fait que les navigateurs considèrent ce qui vient après le signe «#» dans l'URL comme faisant partie de l'historique de navigation. Voici ce qu'il fait: lorsque la page se charge, "# 1" est ajouté à l'URL. Après 50 ms, le "1" est supprimé. Lorsque l'utilisateur clique sur "retour", le navigateur modifie l'URL à ce qu'elle était avant la suppression du "1", MAIS - c'est la même page Web, le navigateur n'a donc pas besoin de recharger la page. - Yossi Shasho

Yossi Shasho
la source
1
Il semble que ce script ajoute "#" à l'URL lorsque la page se charge, et toutes les 50 ms, il ajoute un 1 à l'URL.
ashes999
6
Ce script exploite le fait que les navigateurs considèrent ce qui vient après le signe «#» dans l'URL comme faisant partie de l'historique de navigation. Voici ce qu'il fait: lorsque la page se charge, "# 1" est ajouté à l'URL. Après 50 ms, le "1" est supprimé. Lorsque l'utilisateur clique sur «retour», le navigateur rétablit l'URL à ce qu'elle était avant la suppression du «1» MAIS - c'est la même page Web, le navigateur n'a donc pas besoin de recharger la page.
Yossi Shasho
1
notez que l'URL change deux fois: Nous ne faisons cela que pour masquer l'implémentation, donc personne ne verra que nous avons ajouté "1". Donc, en fait, lorsque l'utilisateur clique en arrière, la page ajoute à nouveau le «# 1» pendant un moment et le supprime à nouveau. BTW - il ne doit pas être "1", cela peut être n'importe quelle chaîne.
Yossi Shasho
2
Le problème avec ceci est que la page défile vers le haut toutes les 50 ms. Si vous avez un formulaire plus grand que la hauteur de la fenêtre, il sera impossible de remplir les valeurs du formulaire.
3komma14
Merci beaucoup. C'est super utile pour une page particulièrement interactive basée sur JavaScript, où le défilement à gauche et à droite fait partie du mécanisme. Cela permet d'éliminer le problème du mouvement de défilement sur Mac OS X qui ramène les utilisateurs à une page par accident (tout est trop facile à faire s'ils sont déjà en train de faire défiler complètement).
Iain Collins
34

D'autres ont choisi de dire «ne faites pas ça», mais cela ne répond pas vraiment à la question de l'affiche. Supposons simplement que tout le monde sache que c'est une mauvaise idée, mais nous sommes curieux de savoir comment cela se fait de toute façon ...

Vous ne pouvez pas désactiver le bouton de retour sur le navigateur d'un utilisateur, mais vous pouvez le faire pour que votre application s'arrête (affiche un message d'erreur, obligeant l'utilisateur à recommencer) si l'utilisateur revient en arrière.

Une approche que j'ai vue pour faire cela consiste à transmettre un jeton sur chaque URL dans l'application et dans chaque formulaire. Le jeton est régénéré sur chaque page, et une fois que l'utilisateur charge une nouvelle page, tous les jetons des pages précédentes sont invalidés.

Lorsque l'utilisateur charge une page, la page ne s'affiche que si le jeton correct (qui a été donné à tous les liens / formulaires sur la page précédente) lui a été transmis.

L'application bancaire en ligne fournie par ma banque est comme ça. Si vous utilisez le bouton de retour du tout, plus aucun lien ne fonctionnera et aucun rechargement de page ne pourra être effectué - à la place, vous voyez un avis vous indiquant que vous ne pouvez pas revenir en arrière et que vous devez recommencer.

thomasrutter
la source
1
Ma banque adopte une approche différente - elle met complètement fin à la session. L'utilisation du bouton de retour équivaut à se déconnecter.
RobG
Cela ressemble à la même approche. Ils détectent que vous êtes revenu en arrière et que vous avez généré une condition d'erreur.
thomasrutter
joomla travaille également autour de la solution de jeton, un jeton est généré par chaque page et chaque formulaire, en fait, il y a des problèmes à propos de cette pratique, comme «lorsqu'un utilisateur reste trop sur une page et que son jeton expire»
Matteo Bononi 'peorthyr'
1
Ne vous méprenez pas, il y a BEAUCOUP de problèmes avec cette pratique. Je ne le recommande pas, je dis simplement comment il est normalement réalisé. Ils transmettent des jetons uniques entre les pages afin de détecter que vous n'avez pas suivi l'un des liens attendus de la page précédente, puis mettent fin à la session ou affichent une erreur. Il casse le bouton de retour, il interrompt la navigation par onglets, il rompt les favoris et / ou les liens de partage, et plus encore - et de plus, il ne résout pas vraiment les problèmes.
thomasrutter
si le problème est que les informations sont perdues ou se cassent déjà si l'utilisateur essaie d'utiliser le bouton de retour, la désactivation du bouton de retour serait une approche plus souhaitée.
PoloHoleSet
10

Alors que je cherche moi-même la réponse, la "meilleure pratique" est ... obsolète ... tout comme les navigateurs le sont (les navigateurs sont vraiment des fossiles laids)

La solution la meilleure / la plus sûre serait que les navigateurs implémentent une méthode / requête où l'utilisateur peut accorder à la page la capacité de contrôler l'interface.

Pourquoi? Parce que pour mon projet actuel, je construis une interface 100% JavaScript construite et contrôlée. Et les boutons de retour n'ont pas leur place dans mon projet car il n'y a pas de changement de page. (Ie sanglant rapide et pas de page-clignote à cause d'un rafraîchissement .. Tout comme une vraie application!)

Je sais pourquoi la capacité de "highjack" l'interface n'est pas là, et je la comprends. Mais au moins, nous devrions avoir la possibilité de le demander au navigateur! Maintenant, ce serait vraiment la «meilleure pratique» sans les dangers du highjack.

Mais les navigateurs étant des navigateurs .. Je ne m'attends pas à ce que quelque chose de sortant se produise à cet égard.

StellarDevil
la source
1
100% en désaccord, alors que cette fonctionnalité serait merveilleuse pour 99% des développeurs Web, ce qui laisse le 1% restant qui abuserait de cette fonctionnalité, il est beaucoup trop dangereux de permettre à un site Web de contrôler votre capacité à utiliser Internet, à mon avis Le script de redirection entre domaines doit soit être banni, soit permettre au pour confirmer si le script est autorisé à s'exécuter à cause de ce type d'abus
MikeT
@MikeT - Comment la désactivation d'un bouton "retour" lors de la navigation sur mes propres pages d'application spécifiques empêcherait-elle quiconque d'utiliser Internet?
PoloHoleDéfini le
@PoloHoleSet si vous avez la possibilité de désactiver le bouton de retour du navigateur, tout le monde le fait également, tout ce dont vous avez besoin est une redirection pour vous envoyer vers une page que vous ne souhaitez pas consulter et s'ils peuvent désactiver vos contrôles de navigation dans le navigateur, comment vous échappez-vous? Je suis sûr que vous êtes tombé sur la page "vous avez un virus" où ils vous invitent à installer leur virus pour supprimer le virus inexistant maintenant imaginez ce site où ils peuvent réellement vous empêcher de partir
MikeT
@MikeT - Je peux entrer n'importe quelle autre URL dans la fenêtre de navigation, je peux fermer un onglet, je peux désactiver javascript. Le point n'est pas de savoir si quelqu'un PEUT, parce que vous pouvez, je peux, n'importe qui peut. Par principe, les gens disent que vous NE DEVRIEZ PAS, si vous le pouvez. Nous ne parlons pas de la façon dont nous concevons un navigateur, nous parlons de la façon dont nous programmons une application.
PoloHoleDéfini le
@PoloHoleSet si vous voulez verrouiller la navigation, vous devrez verrouiller plus que le bouton de retour, car l'historique du navigateur et les URL saisies fourniraient également aux utilisateurs un moyen de contourner votre flux de travail. et comme je l'ai dit, nous ne parlons pas de ce que vous ou moi ferions mais de l'élément malveillant, si le seul moyen d'empêcher un site Web malveillant de prendre le contrôle de votre navigateur est de désactiver tous les js de votre navigateur, vous avez brisé Internet en tant que le Web moderne s'appuie sur des scripts pour fournir du contenu, ce qui est mon point de vue, si vous voulez autant de contrôle sur vos utilisateurs, créez une application pour servir votre flux de travail
MikeT
4

Je cherchais la même question et j'ai trouvé le code suivant sur un site. J'ai pensé à le partager ici:

function noBack()
{
   window.history.forward()
}
noBack();
window.onload = noBack;
window.onpageshow = function(evt){ if(evt.persisted) noBack(); }
window.onunload = function(){ void(0); }

Cependant, comme indiqué par les utilisateurs ci-dessus, ce n'est jamais une bonne pratique et doit être évité pour toutes les raisons.

user704988
la source
2
ce serait bien si vous pouviez indiquer les raisons pour lesquelles cela devrait être évité.
Chris Snow
Selon ce que je comprends, techniquement, vous ne pouvez pas désactiver le bouton Retour sur le navigateur de quelqu'un, vous ne pouvez le faire que pour que le bouton ne soit pas disponible ou continue à charger la même page. Plutôt que de le faire via JS, utilisez le code côté serveur et utilisez une logique appropriée qui n'a pas besoin d'utiliser le bouton Retour. Une action alternative comme recharger la même page ou afficher un message personnalisé doit être utilisée.
user704988
2

Si vous comptez sur la technologie côté client, elle peut être contournée. Javascript peut être désactivé, par exemple. Ou l'utilisateur peut exécuter un script JS pour contourner vos restrictions.

Je suppose que vous ne pouvez le faire qu'en effectuant un suivi côté serveur de la session utilisateur et en redirigeant (comme dans Server.Transfer, pas Response.Redirect) l'utilisateur / navigateur vers la page requise.

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

Il y a eu quelques implémentations différentes. Il existe une solution flash et des solutions iframe / frame pour IE. Regarde ça

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

BTW: Il existe de nombreuses raisons valables pour désactiver (ou au moins empêcher une étape) un bouton de retour - regardez gmail comme un exemple qui implémente la solution de hachage décrite dans l'article ci-dessus.

Google "Comment ajax a cassé le bouton de retour" et vous trouverez de nombreux articles sur les tests utilisateur et la validité de la désactivation du bouton de retour.

DallinDyer
la source
Découvrez également la nouvelle visionneuse de photos de Facebook. Notez que le bouton de retour vous ramène une photo (ce que vous voulez) au lieu de faire le navigateur par défaut
DallinDyer
2

J'ai également eu le même problème, utiliser cette fonction de script Java sur la balise head ou dans, son fonctionnement à 100% bien, ne vous laisserait pas revenir en arrière.

 <script type = "text/javascript" >
      function preventBack(){window.history.forward();}
        setTimeout("preventBack()", 0);
        window.onunload=function(){null};
    </script>
Abdul Khaliq
la source
1

Essayez ce code. A travaillé pour moi. Il change fondamentalement le hachage dès que la page se charge, ce qui change la page d'historique récent en ajoutant "1" sur l'URL. Ainsi, lorsque vous appuyez sur le bouton de retour, il redirige vers la même page à chaque fois.

 <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>
P Shrestha
la source
0

Vous devriez utiliser des publications avec des expirations et des en-têtes de mise en cache appropriés.

epascarello
la source
Voir mon commentaire sur cette réponse pour savoir pourquoi cela ne fonctionne pas.
thomasrutter
0

Au lieu d'essayer de désactiver le bouton de retour du navigateur, il est préférable de le prendre en charge. .NET 3.5 peut très bien gérer les boutons Précédent (et Suivant) du navigateur. Recherche avec Google: "Scriptmanager EnableHistory". Vous pouvez contrôler quelles actions utilisateur ajouteront une entrée à l'historique du navigateur (ScriptManager -> AddHistoryPoint) et votre application ASP.NET reçoit un événement chaque fois que l'utilisateur clique sur les boutons Précédent / Suivant du navigateur. Cela fonctionnera pour tous les navigateurs connus

Corne
la source
0

Globalement, la désactivation du bouton de retour est en effet une mauvaise pratique. Mais, dans certaines situations, la fonctionnalité du bouton de retour n'a pas de sens.

Voici un moyen d'éviter toute navigation indésirable entre les pages:

Première page (fichier top.php):

<?php
    session_start();
    $_SESSION[pid]++;
    echo "top page $_SESSION[pid]";
    echo "<BR><a href='secondary.php?pid=$_SESSION[pid]'>secondary page</a>";
?>

Page secondaire (fichier 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'effet est de permettre la navigation de la première page vers la page secondaire et vers l'arrière (par exemple Annuler) en utilisant vos propres liens. Mais, après le retour à la page supérieure, le bouton de retour du navigateur ne peut pas accéder à la page secondaire.

Anono Mouser
la source
0

Même moi, je faisais face à la même situation avant ... et je n'avais aucune aide. essayez ces choses peut-être que cela fonctionnera pour vous

dans la <head>balise de la page de connexion :

<script type="text/javascript">
    window.history.forward();
</script>

dans le bouton de déconnexion, j'ai fait ceci:

protected void Btn_Logout_Click(object sender, EventArgs e)      
{
    connObj.Close();
    Session.Abandon();
    Session.RemoveAll();
    Session.Clear();
    HttpContext.Current.Session.Abandon();
}

et sur la page de connexion, j'ai mis l'accent sur la zone de texte Nom d'utilisateur comme ceci:

protected void Page_Load(object sender, EventArgs e)
{
    _txtUsername.Focus();
}

j'espère que cela aide ... :) quelqu'un plz m'apprend comment modifier cette page ...

Robin
la source
a) éditez votre réponse b) cliquez sur le point d'interrogation c) cliquez sur l'aide avancée d) lisez et appliquez :-) Notez également que ctrl-k un / indente le bloc sélectionné pour un / formater comme code. De plus, le formateur ne peut pas bien gérer les onglets (probablement pas un problème ici, cependant)
kleopatra
0

SI vous avez besoin de supprimer en douceur les touches de suppression et de retour arrière dans votre application Web, de sorte que lorsqu'elles modifient / suppriment des éléments, la page ne soit pas redirigée de manière inattendue, vous pouvez utiliser ce code:

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);
nvd_ai
la source
0

Essayez ce code. Vous avez juste besoin d'implémenter ce code dans la page maître et cela fonctionnera pour vous sur toutes les pages

<script type="text/javascript">
    window.onload = function () {
        noBack();
    }
    function noBack() {
        window.history.forward();
    }
</script>
<body  onpageshow="if (event.persisted) noBack();">
</body>
Suhaib Janjua
la source
0

Le problème avec Yossi Shasho code de est que la page défile vers le haut toutes les 50 ms. J'ai donc modifié ce code. Maintenant, il fonctionne bien sur tous les navigateurs modernes, IE8 et au-dessus

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(); });
Vishnu TS
la source
0

Cela semble avoir fonctionné pour nous.

history.pushState(null, null, $(location).attr('href'));
window.addEventListener('popstate', function () {
    history.pushState(null, null, $(location).attr('href'));
});
jgabb
la source
0
<script>
    $(document).ready(function() {
        function disableBack() { window.history.forward() }

        window.onload = disableBack();
        window.onpageshow = function(evt) { if (evt.persisted) disableBack() }
    });
</script>
chétan
la source