(ブラウザ間で)ブラウザの[戻る]ボタンを無効にする方法は?
(ブラウザ間で)ブラウザの[戻る]ボタンを無効にする方法は?
回答:
この質問は、この非常によく似ている1 ...
これを機能させるには、キャッシュを強制的に期限切れにする必要があります。次のコードをページコードの背後に配置します。
Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)
予想されるブラウザの動作を無効にしないでください。
あなたのページに、ユーザーが1、2ページ戻る可能性を処理させる。彼らのソフトウェアを不自由にしようとしないでください。
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 the back button!
</body>
</html>
何してるの?
コメントから:
このスクリプトは、ブラウザーがURLの "#"記号以降のすべてを閲覧履歴の一部と見なすという事実を利用しています。機能:ページが読み込まれると、URLに「#1」が追加されます。50ms後、「1」は削除されます。ユーザーが「戻る」をクリックすると、ブラウザはURLを「1」が削除される前の状態に戻しますが、同じWebページであるため、ブラウザでページを再読み込みする必要はありません。– Yossi Shasho
他の人は「これをしないでください」と言うためのアプローチをとっていますが、それは実際にポスターの質問に答えません。誰もがこれが悪い考えであることを知っていると仮定しましょうが、とにかくそれがどのように行われるのかについて興味があります...
ユーザーのブラウザーの[戻る]ボタンを無効にすることはできませんが、ユーザーが戻ったときにアプリケーションが壊れる(エラーメッセージが表示され、ユーザーに最初からやり直すように要求する)ようにすることはできます。
これを行うために私が見た1つのアプローチは、アプリケーション内およびすべてのフォーム内のすべてのURLでトークンを渡すことです。トークンはすべてのページで再生成され、ユーザーが新しいページをロードすると、前のページのトークンはすべて無効になります。
ユーザーがページをロードすると、ページには正しいトークン(前のページのすべてのリンク/フォームに与えられた)が渡された場合にのみ表示されます。
私の銀行が提供するオンラインバンキングアプリケーションは次のとおりです。戻るボタンを使用すると、リンクが機能しなくなり、ページを再読み込みできなくなります。代わりに、戻ることができないという通知が表示され、最初からやり直す必要があります。
私が自分で答えを探している間、「ベストプラクティス」は...ブラウザーがそうであるように時代遅れです...(本当にブラウザーは醜い化石です)
最善の/最も安全なソリューションは、ブラウザがメソッド/リクエストを実装して、ユーザーがページにインターフェースを制御する機能を付与できるようにすることです。
どうして?私の現在のプロジェクトでは、100%JavaScriptで構築および制御されたインターフェイスを構築しています。ページの変更がないため、プロジェクトに戻るボタンはありません。(つまり、非常に高速で、更新のためにページがフラッシュされることはありません。実際のアプリケーションと同じように!)
インターフェイスを「ハイジャック」する機能がない理由はわかっていますが、理解しています。しかし、少なくともブラウザからそれを要求する機能が必要です!これは、ハイジャックの危険がなければ、本当に「ベストプラクティス」になります。
しかし、ブラウザはブラウザです。この点に関して、何か既存のことが起こるとは思いません。
私は同じ質問を探していて、サイトで次のコードを見つけました。ここでそれを共有すると思った:
function noBack()
{
window.history.forward()
}
noBack();
window.onload = noBack;
window.onpageshow = function(evt){ if(evt.persisted) noBack(); }
window.onunload = function(){ void(0); }
ただし、上記のユーザーが述べたように、これは決して良い習慣ではなく、あらゆる理由で回避する必要があります。
いくつかの異なる実装がありました。IEにはフラッシュソリューションといくつかのiframe / frameソリューションがあります。これをチェック
ところで:戻るボタンを無効にする(または少なくとも1つのステップを防ぐ)には、多くの正当な理由があります。上記の記事で説明したハッシュソリューションを実装する例としてgmailを見てください。
Googleは「どのようにajaxが戻るボタンを壊したのか」と、ユーザーのテストと戻るボタンを無効にすることの妥当性に関する多くの記事を見つけます。
私も同じ問題がありました。このJavaスクリプト関数をヘッドタグまたはで使用すると、100%正常に動作し、元に戻せません。
<script type = "text/javascript" >
function preventBack(){window.history.forward();}
setTimeout("preventBack()", 0);
window.onunload=function(){null};
</script>
このコードを試してください。私のために働いた。基本的には、ページがロードされるとすぐにハッシュを変更し、URLに「1」を追加することによって最近の履歴ページを変更します。したがって、戻るボタンを押すと、毎回同じページにリダイレクトされます。
<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>
適切な有効期限とキャッシングヘッダーを持つ投稿を使用する必要があります。
全体として、戻るボタンを無効にすることは実際に悪い習慣です。ただし、特定の状況では、戻るボタンの機能が意味をなさない場合があります。
ページ間の不要なナビゲーションを防ぐ方法の1つは次のとおりです。
トップページ(ファイルtop.php):
<?php
session_start();
$_SESSION[pid]++;
echo "top page $_SESSION[pid]";
echo "<BR><a href='secondary.php?pid=$_SESSION[pid]'>secondary page</a>";
?>
2次ページ(ファイル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>";
}
?>
その効果は、トップページからセカンダリページに移動し、独自のリンクを使用して戻る(たとえば、キャンセル)ことを許可することです。ただし、トップページに戻った後、ブラウザの戻るボタンはセカンダリページに移動できません。
以前も同じ状況に直面していて、何の助けもありませんでした。これらのことを試してみてください多分これらはあなたのために働くでしょう
ログインページ<head>タグ:
<script type="text/javascript">
window.history.forward();
</script>
ログアウトボタンで私はこれをしました:
protected void Btn_Logout_Click(object sender, EventArgs e)
{
connObj.Close();
Session.Abandon();
Session.RemoveAll();
Session.Clear();
HttpContext.Current.Session.Abandon();
}
ログインページでは、次のようにユーザー名テキストボックスに焦点を当てています:
protected void Page_Load(object sender, EventArgs e)
{
_txtUsername.Focus();
}
これが役に立てば幸い... :)誰かがこのページを編集する方法を教えてくれます...
アイテムを編集/削除しているときにページが予期せずリダイレクトされないように、Webアプリの削除キーとバックスペースキーを軽く抑制する必要がある場合は、次のコードを使用できます。
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);
このコードを試してください。このコードをマスターページに実装するだけで、すべてのページで機能します
<script type="text/javascript">
window.onload = function () {
noBack();
}
function noBack() {
window.history.forward();
}
</script>
<body onpageshow="if (event.persisted) noBack();">
</body>
Yossi Shashoのコードの問題は、ページが50ミリ秒ごとに最上部にスクロールすることです。だから私はそのコードを変更しました。現在、IE8以上のすべての最新ブラウザーで正常に動作しています
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(); });