- PR -

ブラウザの戻るボタンのイベント取得について。。

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-01 15:54
引用:

GOLF@スポコンさんの書き込み (2004-03-01 15:47) より:

やはりPOSTを使用した場合、ブラウザの戻るボタンは使用しないような
仕様にして開発しているんですね。


 「使用しないような仕様」ではなく、「運用系で使用しないようにお願いする」です。仕様は「使用されたときは、データの保証をしない」です__;


 IEAKで「戻る」や「更新」を殺すことができるのかもしれませんが、それはそれで問題ですしねぇ。。。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-03-01 16:26
引用:

ページの有効期限切れで更新ボタンを押すとちゃんと検索結果が表示されます。
それを自動的にできないものかなと思いまして。。。


何かアドバイス等ございましたら、宜しくお願いします。
それはJavaScriptを使用するしない関係なくできない!といった場合
でも結構ですので、御返事おまちしています。



永井です。

「ページの有効期限切れ」と出てしまった場合、有効期限切れなので、その中に何が書いてあろうが無駄でしょう。
これが出るのは、POST送信で、そのResponseにExpireやら何やらが設定されている場合に出るんだったような気がしますが……まあ、とりあえず「有効期限切れ」になってしまったら手は出せません(と思います)。

さて、「有効期限切れ」になっていないケースに限られますが、JavaScriptでback検知が可能です。

以下、「Back」で戻ってきたらAlertを表示してリロードするサンプルです。だいぶ手抜きですが、WindowsのIE6とかなら読めると思います。

まず以下のようなsample1.htmlを用意します。

コード:
<html>
<head>
<title>sample-1</title>
<script language="JavaScript1.1">
<!--
function initialize(f) {
	if(f.flg.value == "t"){
		alert("p");
		location.reload();
	}
}

function changeValue(f) {
	f.flg.value="t";
}
//-->
</script>
</head>
<body OnLoad="initialize(document.form1);">
<p>最初のページ</p>
<form name="form1" method="POST" action="sample2.html">
<input type="submit" value="next" OnClick="changeValue(document.form1);">
<input type="hidden" name="flg" value="f">
</form>
</body>
</html>



で、sample2……は何でもいいんですが、とりあえず書いておきます。

コード:
<html>
<head>
<title>sample-2</title>
</head>
<body>
<p>2番目のページ</p>
</body>
</html>



以上のようなJavaScriptで「Back」で戻ってきたかが検知出来ます。UAに依存したりする可能性は大なので、あまりアテにならないですが……。

美しくはないんですが、これをちょこちょこ拡張して「バックして、主要項目が変更されないまま再びサブミットが押された場合は再サブミットせずにフォワード」等をやったりしました……。
Gordie
ベテラン
会議室デビュー日: 2003/10/14
投稿数: 64
投稿日時: 2004-03-01 18:40
<!−− 無視されたようなので削除 −−>

[ メッセージ編集済み 編集者: Gordie 編集日時 2004-03-02 09:48 ]
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-03-01 20:13
Jittaさん、こんばんは。

引用:

 なので、私のところでは「戻る操作は禁止!!!」と表示させることにしました


以前、「戻る」ボタンのイベントというスレッドで、
> SessionとViewStateの両方にカウンタを保持してポストバック毎にインクリメント
> し、双方の値が一致するかどうかをチェックする
という方法を提案をした事があるんですが、その後実際に、カウンタの不一致を検出した場合はそれをイベントで通知するコントロール(IValidator を実装)を作って使用しています。

#ネックは、セッションタイムアウトなんですが、それはそれでデータの整合性が保証出来ないという事で...。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-01 22:00
引用:

きくちゃんさんの書き込み (2004-03-01 20:13) より:

以前、「戻る」ボタンのイベントというスレッドで、
> SessionとViewStateの両方にカウンタを保持してポストバック毎にインクリメント
> し、双方の値が一致するかどうかをチェックする
という方法を提案をした事があるんですが、その後実際に、カウンタの不一致を検出した場合はそれをイベントで通知するコントロール(IValidator を実装)を作って使用しています。


 なるほど。。。カウンタ2重持ちですか。それは思いつきませんでした。

 私の方のネックは「戻るをしたときに、サーバサイドで追加したスクリプトがまた走って、入力用子画面がまた表示される」なんです。。。これは、防げませんよね?


 WebアプリにWinアプリのような操作性を求めることが間違っている、とは思うのですが。。。
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2004-03-02 01:04
引用:

 WebアプリにWinアプリのような操作性を求めることが間違っている、とは思うのですが。。。



ん?戻るボタンは、Webアプリ特有の操作だと思いますが?
# 揚げ足をとってしまいましたが、Jittaさまの仰りたいことはよくわかっているつもりです。

例えば、amazon.comで「戻る」押したからって、『不正な処理です』って表示されたりしたら不安になりますよね。
そういう意味で、「戻る」ボタンを押されても正常に動作するように作ることができるならそれに越したことはありません。

ですが、そこを制限できる環境(イントラ内でのみ利用とか)であれば、真っ先に制限事項として挙げてしまいたい事項です。
とはいえ、「押すな」と書いてあっても押してしまう人はいるわけで。。。
# リンクを押し間違えたときに無意識にBackSpaceを押す癖がついている人とか。私のように。
最低限、データ破壊などの障害を発生させないようにはしておく必要がありますね。

前置きが長くなりましたが、私も考えてみました。
各ページの一番最初で、『window.history.forward();』。
気休め程度にしかなりませんが、シンプルでいいかなと。

# ちなみに、実践で使ったことはまだありませんのであしからず。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-03-02 01:30
Jittaさん、こんばんは。

引用:

 私の方のネックは「戻るをしたときに、サーバサイドで追加したスクリプトがまた走って、入力用子画面がまた表示される」なんです。。。これは、防げませんよね?


うーん、セッションに何らかの形で画面遷移の情報を保持しておいて、子画面側がそれを見に行って表示内容を制御できるような気もしますが、どうなんでしょう...。

私の方では、入力画面に戻れたり、古い情報が表示されてしまうのはもう、仕方ないと割り切って、その代わりそこから再度ポストされた場合はブロックしてます。
更新系の処理が二重に走るのさえ防げれば、極端な話「不正な処理です。ブラウザを閉じて再度実行して下さい」でも「ログアウトしました。再度ログインして下さい」でも構わないかな、と。
小次郎
会議室デビュー日: 2003/11/07
投稿数: 12
投稿日時: 2004-03-13 01:17
ブラウザの情報を保存しない・・・みたいな設定でできたはずです。
たしかあったはずなんだけど忘れました。
けっこうコアなやり方なんでネットで探しても出てこないかもしれません

スキルアップ/キャリアアップ(JOB@IT)