web-dev-qa-db-ja.com

ブラウザの戻るボタンを無効にする

ユーザーが反撃した場合に同じ情報を再送信し、データのフローと整合性を台無しにする可能性があるアプリケーションを作成しています。 JavaScriptをオンまたはオフにしているユーザーに対して無効にするにはどうすればよいですか?

31
Haoest

残念ながらそれは不可能です。ただし、アプリケーションのナビゲーションモデルを検討してください。 Post/Redirect/Get PRGモデルを使用していますか? http://en.wikipedia.org/wiki/Post/Redirect/Get

このモデルは、ポストバックモデルよりも戻るボタンに対応しています。

76
Scott Hanselman

すべきではない。

スクリプトをページのonbeforeunloadイベントに添付して、ユーザーがしたいことをユーザーに確認することができます。そして、少し先に進んでtry無効にする にすることもできますが、これはJavaScriptを有効にしているユーザーにのみ機能しますオン。代わりに、アプリケーションを書き換えて、各ページの送信時にトランザクションをコミットせず、プロセスの最後にのみコミットするようにしてください。

12
blowdart

戻るボタンを壊さないように英雄的な努力をすることを強くお勧めします。これはユーザーを遠ざけ、No.1を達成するための確実な方法です Jacob Neilsenのトップ10 Webデザインミス、1999年 =。

「<シナリオをここに挿入>の戻るボタンを壊さないようにするにはどうすればよいですか?」

スコットの回答がマークに近い場合は、フローをPRGモデルに変更することを検討してください。それ以外の場合は、もう少し詳しく説明し、どのように支援できるかを確認してください。

8

JavaScriptを使用して[戻る]ボタンを無効にする小さなハックを思いつきました。 chrome 10、Firefox 3.6、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>
7
Yossi Shasho

最善のオプションは、フローを制御するためにポストバックに依存しないことですが、それが行き詰まっている場合(現時点では)

あなたはこのようなものを使うかもしれません:

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

すぐにすべてのブラウザで機能するとは限りませんが、次のようなコードにチェックを導入できます。

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

これは問題をある程度まで解決します。コードはチェックされていません-例の目的のみです。

5
Claus Thomsen

すべての主要なブラウザで戻るボタンを無効にすることが可能です。ハッシュ値を使用して、戻るボタンを完全に無効にします。この5行のコードをページに挿入するだけです

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

詳細な説明

4
bugwheels94

これに関する以前の投稿は次のとおりです。 [戻る]ボタンの使用を防ぐ(IEの場合)

3
kemiller2002

戻るボタンを無効にするために思いついたものは何でも、将来のブラウザでは戻るボタンを停止しない可能性があります。

開発サイクルの後半にある場合は、上記の提案を試すことをお勧めしますが、時間があるときは、フローを構造化して、戻るボタンがサイトのロジックに干渉しないようにする必要があります。彼らはそうすることを期待しています。

3
Keith

それは真実です。適切な検証を追加して、重複データが混乱しないことを確認する必要があります。ただし、私の場合と同様に、フォームの後にサードパーティのAPIを使用しているため、データを完全に制御することはできません。だから私はこれを使いました

history.go(+1);

これにより、ユーザーが「支払い」ページに戻ろうとすると(たとえば、支払いを行うだけ)、「支払い」ページの後に来るはずの「領収書」にユーザーが転送されます。ただし、慎重に使用してください

1
katzmopolitan

下のリンクを見つける

Asp.netでJavaScriptを使用してブラウザの戻るボタン機能を無効にする| ASP.Netがブラウザの戻るボタンを無効にする(JavaScriptを使用)

http://www.aspdotnet-suresh.com/2011/11/disable-browser-back-button.html

0
Nimmanagottu

私はこれを使用してこれを達成することができました:

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

Response.Cache.SetCacheability(HttpCacheability.NoCache);を使用した場合Officeファイルをダウンロードできませんでした。

0
user825345

各フォームのデータを_NEWウィンドウに投稿できます。これにより、各ウィンドウの[戻る]ボタンが無効になりますが、JavaScriptがないと、古いウィンドウを強制的に閉じることが難しい場合があります。

0
skamradt

Rollaの4人の男が、ずっと前に(遠く離れた銀河で)[戻る]ボタンを無効にすることについてこの記事を書いた: http://www.4guysfromrolla.com/webtech/111500-1.shtml

0
torial