2008-09-17 10 views
31

Je suis en train d'écrire une application qui, si l'utilisateur recopie, peut renvoyer la même information et gâcher le flux et l'intégrité des données. Comment puis-je le désactiver pour les utilisateurs avec et sans javascript?Désactivation du bouton Précédent sur le navigateur

+40

Si je suis sur votre site, le bouton de retour est encore MINE. Ne plaisante pas avec ce qui est à moi ... ;-) – Shog9

+5

C'est la mauvaise question. Ce que vous devez faire est de concevoir l'application de sorte que lorsque l'information est renvoyée, l'application la reconnaîtra et agira de manière appropriée. – reinierpost

Répondre

76

Ce n'est pas possible, malheureusement. Cependant, considérez votre modèle de navigation d'applications. Utilisez-vous Post/Redirect/Get PRG Model? http://en.wikipedia.org/wiki/Post/Redirect/Get?

Ce modèle est plus sensible aux boutons de retour que le modèle Postback.

+50

Rien de triste à ce sujet. –

+19

Point valide. Je suis juste triste. ;) –

+0

Scott - Est-ce que la possibilité de désactiver les barres d'outils et le menu contextuel est spécifique à IE? J'ai vu des applications LOB qui verrouillent complètement la navigation, mais (encore une fois malheureusement) ils exigent également que l'utilisateur ait IE. –

12

Vous ne devriez pas.

Vous pouvez attacher un script à l'événement onbeforeunload d'une page et confirmer à l'utilisateur ce qu'il veut faire; et vous pouvez aller un peu plus loin et essayez à disable it mais bien sûr cela ne fonctionnera que pour les utilisateurs qui ont javascript activé. Au lieu de cela, regardez la réécriture de l'application afin de ne pas valider les transactions sur chaque page soumise, mais seulement à la fin du processus.

+0

Hmmm ... l'événement onbeforeunload serait appelé aussi lors de la navigation loin de la page parce que l'utilisateur va simplement à une autre page (non seulement parce que l'utilisateur a appuyé sur le bouton de retour), et le script serait appelé. –

0

Vous pouvez publier les données sur chaque formulaire dans une fenêtre _NEW. Cela désactivera le bouton de retour sur chaque fenêtre, mais sans javascript, il pourrait être difficile de forcer l'ancien fermé.

8

Je vous conseille vivement d'aller à des longueurs héroïques pour éviter la rupture du bouton de retour, il est un moyen sûr d'aliéner vos utilisateurs et même fait au n ° 1 sur Jacob Neilsen's Top 10 Web Design Mistakes in 1999.

Peut-être que vous pourriez envisager de plutôt poser la question: "Comment éviter de casser le bouton de retour pour < insérer votre scénario ici >?"

Si la réponse de Scott est proche de la réalité, envisagez de changer votre flux pour le modèle PRG. Si c'est autre chose, donnez un peu plus de détails et voyez comment nous pouvons vous aider.

+2

Il n'a pas dit qu'il voulait "casser" le bouton arrière, il veut éviter un piège commun où les modèles de conception Ajax modernes échouent parce qu'un utilisateur appuie "Retour" signifiant "Annuler la chose que je viens de faire avec votre application Ajax" et au lieu obtient "Retour une requête HTTP arbitraire et ambiguë". – pcorcoran

+1

Pour moi qui lit juste "il ne voulait pas casser le bouton arrière, il voulait juste casser le bouton arrière pour éviter qu'il soit cassé". : S Il est possible d'obtenir AJAX/JavaScript et les boutons de retour pour jouer gentil, tout ce que je suggère est que ce serait la route que je recommande de suivre. –

5

La meilleure option est de ne pas dépendre de postbacks pour contrôler le flux, si vous êtes coincé avec (pour l'instant)

vous pouvez utiliser quelque chose comme ceci:

Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.Cache.SetExpires(Now.AddSeconds(-1)); 
    Response.Cache.SetNoStore(); 
    Response.AppendHeader("Pragma", "no-cache"); 

Bientôt vous trouverez que il ne fonctionnera pas sur tous les navigateurs, mais vous pouvez introduire un chèque dans votre code comme:

if (Page.IsPostBack) 
{ 
     if (pageIsExpired()){ 
      Response.Redirect("/Some_error_page.htm"); 
     } 
     else { 
      var now = Now; 
      Session("TimeStamp") = now.ToString(); 
      ViewState("TimeStamp") = now.ToString(); 
     } 

    private boolean pageIsExpired() 
    { 
    if (Session("TimeStamp") == null || ViewState("TimeStamp") == null) 
     return false; 

    if (Session("TimeStamp") == ViewState("TimeStamp")) 
     return true; 

     return false; 
    } 

cela va résoudre le problème dans une certaine mesure, le code décochée - uniquement pour les exemples pu rposes ..

3

Tout ce que vous venez avec pour désactiver le bouton de retour pourrait ne pas arrêter le bouton de retour dans les futurs navigateurs. Si elle est en retard dans le cycle de développement, je vous suggère d'essayer quelques suggestions ci-dessus mais quand vous avez le temps, vous devez structurer votre flux de sorte que le bouton retour n'interfère pas avec la logique de votre site, il vous ramène simplement à la page précédente comme ils l'attendent.

7

Je suis venu avec un petit hack qui désactive le bouton de retour en utilisant JavaScript.Je l'ai vérifié sur le 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 back! 
</body> 
</html> 
+1

C'est juste méchant ... – Soumya

+3

Mais ça marche - allez-y et testez-le. –

+1

Je n'en doute pas. C'est juste une mauvaise expérience pour l'utilisateur, qui peut en fait * vouloir * revenir en arrière. – Soumya

0

j'ai pu accomplir cela en utilisant:

Response.Cache.SetExpires(DateTime.MinValue); 
Response.Cache.SetNoStore(); 

Quand je Response.Cache.SetCacheability (HttpCacheability.NoCache); cela m'a empêché de télécharger des fichiers de bureau.

1

Il est vrai, une validation correcte devrait être ajoutée pour s'assurer que les données en double ne gâchent pas les choses. Cependant, comme dans mon cas, je ne contrôle pas complètement les données puisque j'utilise une API tierce après mon formulaire. Donc, j'ai utilisé cette

history.go(+1); 

Ceci enverra l'utilisateur avant la « réception » qui est censé venir après page « paiement » si elles essaient de revenir à la page « paiement » (juste donner un paiement par exemple) . Utilisez avec parcimonie, mais

4

Il est possible de désactiver le bouton de retour dans tous les principaux navigateurs. Il utilise simplement des valeurs de hachage pour désactiver complètement le bouton de retour. Il suffit de mettre ces 5 lignes de code dans votre page

<script> 
window.location.hash="no-back-button"; 
window.location.hash="Again-no-back-button";//for google chrome 
window.onhashchange=function(){window.location.hash="no-back-button";} 
</script> 

Detailed description

+0

Tricky one..but fonctionne ... –

+0

@Ankit: Brillant! Sauvé ma vie! Merci!!! – Emma

+0

ne fonctionne pas correctement dans tous les cas, à savoir chrome, safari. –

Questions connexes