WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:NN4.7のhistory.back()の挙動について

0:[投稿] クマ [MAIL] [2004/01/26 14:10 ][環境:NN4.7 Apache/tomcat]

フォームにあるhiddenフィールドにjavascriptで値をセットして送信して、送信後の画面でブラウザの「戻る」ボタン、もしくは、画面にある「戻る」ボタン(javascriptのhistory.back()を使用)をクリックして戻ると、前画面でhiddenフィールドにセットした値が消えてしまいます。

どなたかこのような現象に出会った方はおられるでしょうか?
また、解決方法、回避策などご存知の方、ご教授いただければ幸いです。
宜しくお願い致します。


1:[回答] いそね [2004/01/29 11:41 ]

画面のonload時に値を初期化するような処理は入っていないでしょうか?

「javascriptで値をセット」というのが、画面読み込み時か
セレクトボックスやチェックボックスで選択した値を入れているのか分かりませんが、
後者であればonload時に「項目が選択されていればhiddenに値を渡す」
という処理をいれる事によって回避できるかと思います。


2:[回答] クマ [2004/01/29 20:05 ]

いそね さん
ご回答有難うございます。

画面のonload時に値を初期化するような処理は入れておりません。

hiddenに値をセットするまでの画面の遷移を以下に説明します。

まず、親画面がありまして、この画面から子画面(サブウィンドウ)を開きます。
子画面内にあるセレクトボックスから選択した値を親画面にある
hidden項目にセットします。
そして、親画面をサブミットして次画面に遷移して、ブラウザの
「戻る」ボタン、もしくは、JavScriptのhistory.back()で親画面
に戻ります。
そうすると、親画面のhidden項目にセットしていた値が消えている。

セレクトボックスが親画面にあれば、いそねさんの言われる方法で
回避できるのですが、そうもいきません。。。

他の方法がございましたら、また宜しくお願い致します。



3:[回答] いそね [2004/01/30 17:37 ]

サブウィンドウからの操作でしたか。

サブウィンドウが残っていれば、親画面のonload時にそちらの値をとるような処理をいれる事で対処できそうですが・・・サブウィンドウは閉じられる可能性があるんですよね?


4:[回答] MALIC [2004/02/02 10:26 ]

前にどこかで読んだけど・・
HTMLには、前画面のフィールドの値を保持する規定が無いので、HTML文書作成者が値をどこかに保持しないといけないです。
HTMLファイル自体はキャッシュされますが。初期表示後、値を入力/変更したものの保存はされるとは限りません。

対策例としては、親に隠しフレームを作るとか。


5:[回答] クマ [2004/02/02 21:05 ]

いそねさん、MALICさん

ご回答有難うございます。

現在のシステムでは、クッキー使用禁止で、
フレームを使用していいかは確認しないと分かりませんが、
フレームを使用した場合に大改修になりそうなので、
許可が下りるか分かりません。
画面の出力は、サーブレットで行っているので相当手間が掛かる
と思われます。

いろいろと有難うございました。


6:[回答] いそね [2004/02/03 13:38 ]

一応、隠しフレームで作る方法です。

■ 親ページを開くときにフレームを呼び出します。
例だと上画面(main)が親画面。下画面(dummy)がダミー画面です。

<frameset rows="*,0">
 <frame src="XXX.html" name="main" frameborder="no">
 <frame src="dummy.html" name="dummy" frameborder="no">
</frameset>

※親画面は普通に作ればいいので、ServeletでもJSPでも問題ありません。

■ダミー画面ではテキストボックスを作成してください。
子画面から親画面に値を渡すとき、ダミー画面のテキストボックスにも渡します。

<input type="text" name="dummyText" value="">

※テキストボックスだとNN4.7でもキャッシュが残ります。

■親画面の読み込み時(onload)、ダミー画面のテキストボックスに
値があったらhiddenにその値を入れるようにします。
(例の'hiddenText'はhiddenフィールドの名前です)

function first(){
 var dummyWin = window.parent.dummy;

 if(dummyWin
   && dummyWin.document.forms[0].dummyText.value != ""){
   document.forms[0].hiddenText.value
    = dummyWin.document.forms[0].dummyText.value;
 }
}

後は親画面の値の送信時にフレームを解除してしまえばOKです。
対象画面に手を加えるだけですので、大幅な改修は必要ありません。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World