質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

28273閲覧

ページを進む、戻るをしても状態を保持する

pegy

総合スコア243

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2017/05/06 11:16

下記のように、金額範囲を選択するを選択した場合、Jqueryで追加の選択肢が現れそこでまた、諸々選択するUIになっております。

1.ページを進む、戻るを行った場合、金額範囲を選択するのセレクトボタンしか残らず、その後の追加の選択肢が一度消えてしまいます。その状態でまた金額範囲を選択するのセレクトボタンを操作すると一度入力した値は戻って聞きます。
これがUIとしては不親切であるため、一度金額範囲を選択するを選択し、その後の追加の選択肢を入力した場合、ページを進む、戻るしてもその状態を保存していたいのですが、方法はございますでしょうか?

2.加えて、ページをリロードした場合には、当然これらの情報はすべてブラウザから消えてしまい、選択肢も初期化されてしまうのですが、リロードしても状態を保存させておく方法はJS上ございますでしょうか?

よろしくお願い申し上げます。

HTML

1 <h3>金額範囲の設定</h3> 2 <p> 3 <input class="spec" type="radio" name="moneyChoice" value="yes">金額範囲を選択する 4 <br> 5 <input class="spec" type="radio" name="moneyChoice" value="no" checked>金額範囲を選択しない 6 </p> 7 8 <div id="moneyRange"> 9 10 11 <input type="text" name="median" id="median" class="money" style="text-align:right; " name="" value="" placeholder="目安金額(中央値)を入力"> 12 <input type="text" name="step" id="step" class="money" style="text-align:right; " name="" value="" placeholder="ステップ金額(階段値)を入力"> 13 <br> 14 <select name="max" id="max" size=1 disabled style="width:300px;text-align:right;"> 15 <option value=""></option> 16 <option value=""></option> 17 <option value=""></option> 18 </select> 19 <br> 20 <span>下限値は</span> 21 <span id="min"></span> 22 <input id="min2" name="min" type="hidden" name="" value=""> 23 </div>

Javascript

1$(function(){ 2 $('#median,#step').on('change',function(){ 3 $('#max').find('option').remove(); 4 $('#max').prop('disabled', true); 5 var median=parseInt(($('#median').val()).replace(/,/g,"")); 6 var step=parseInt(($('#step').val()).replace(/,/g,"")); 7 if (isNaN(median) || isNaN(step) || step == 0) { 8 $('#min').text(''); 9 return;} 10 var maxChoice= Math.floor(median*2/step); 11 var flg=median>0 && step>0; 12 $('#max').find('option').remove(); 13 for(var i=1; i<=maxChoice; i++){ 14 var num=flg? median+(step*i):''; 15 $('#max').append($('<option>').val(num).text(num)); 16 } 17 $('#max').prop('disabled',!flg); 18if ((median-step)>=0) { 19 $('#min').text(median-step); 20 $('#min2').val(median-step); 21}else{ 22 $('#min').text(0); 23 $('#min2').val(0); 24} 25 }).trigger('change'); 26 27 28 $('#max').change(function(){ 29 var median=parseInt(($('#median').val()).replace(/,/g,"")); 30 var max=$('#max').val(); 31 var bottom= median-(max-median); 32 if (bottom<0) { 33 $('#min').text(0); 34 $('#min2').val(0); 35 }else{ 36 $('#min').text(bottom) 37 $('#min2').val(bottom); 38 }; 39 }); 40});

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ソースコードを拝見した感じ,既にjQueryで作るのがつらいレベルになってきていますね。Vue.jsReactSPA(Single Page Application)にしましょう。この系統のものはそもそもページ遷移が発生しないという特長を持っています。TwitterやFacebookを思い浮かべてみてください。

投稿2017/05/06 11:54

mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mpyw

2017/05/06 11:59 編集

尤も,「サーバサイドも含めてほとんど全部作り直せるなら」という前提での回答であり,もし「今回はそこまで要求しないのでとりあえず完成させたい」程度のものでしたらスルーしてください。普通にlocalStorageかsessionStorageに保持する程度でいいと思います。(但し,ずっとこのやり方で機能追加を続けていくといつか破綻します)
pegy

2017/05/06 12:35

ご回答ありがとうございます。 ご助言いただいた方法も参考にさせて頂きます。 因みにですが、sessionやlocalstrageに値を保存できるとして、changeではなく、どのようなイベントで値を取得し表示させるのが一般的でしょうか? 宜しくお願い申し上げます。
mpyw

2017/05/06 13:10 編集

jQueryベースでやるならchangeが一般的,というか他に使えそうなイベントが無いような… Vue.jsでやるなら双方向データバインディングなので,JavaScriptの変数とフォームの値が最初に宣言しておくだけで勝手に同期されますね。ぶっちゃけこれが一番ラクです。(また最初に言ったようにページ遷移は発生しないので保存処理を考える必要がありません,変数はブラウザを閉じない限りはずっと保持されます)
pegy

2017/05/06 15:28

ご回答ありがとうございます。 見返したら私の差し上げた質問の方法に問題がありました。申し訳ございません。 画面が戻った時に追加の選択肢は消えるが値は残っている状態であるとして、これを戻ったという行為をトリガーにして同じような表示(例えば下記の例ではapendしたoptionを表示した状態にする)にすることは可能なのでしょうか? 度々すみません、ご迷惑かと思うのでこれで最後に致します。 宜しくお願い申し上げます
mpyw

2017/05/06 17:55 編集

onbeforeunloadよりonunloadのほうが適切かもしれません,ユースケースに応じて選択してください。onbeforeunloadはreturnする値によってダイアログを出すことができ,ユーザの選択次第でページ遷移がキャンセルされます。onunloadはページ遷移が確定した直後に実行されます。
pegy

2017/05/07 03:49

コメントありがとうございます。また、最後までお付き合いを頂き深謝を申し上げます。どちらも試してみます。 宜しくお願い申し上げます。
guest

0

localStorage に保存して、ページ読み込み時に確認したらどうでしょう。

【Window.localStorage - Web API インターフェイス | MDN】
https://developer.mozilla.org/ja/docs/Web/API/Window/localStorage

【localStorageで複数のデータを保存する | Tips Note by TAM】
https://www.tam-tam.co.jp/tipsnote/javascript/post5978.html

投稿2017/05/06 11:38

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pegy

2017/05/06 12:10

ご回答ありがとうございます。一点疑問があるのですが、ページを進む、戻るをした場合、金額範囲を選択するの、金額範囲を選択しないのselectしか表示されませんが、またchangeをすると、一度入力したそれ以下の追加入力データはもどってきます。とするとリロードは別として、進む、戻るの場合、ブラウザは状態は保存しており表示上の問題かと考えていたのですが、そのような認識には誤りがあるのでしょうか? つまり、一旦入力された場合はchangeではないトリガーで、処理を分岐させる程度に考えておりましたが、如何でしょうか? 宜しくお願い致します
kei344

2017/05/06 12:17

そもそもリロードの対策を考えるのであれば、「進む、戻る」のためだけに別コードを考えるのは手間なだけかと思います。また、「進む、戻る」はブラウザによって挙動が違ったような気もします。
pegy

2017/05/06 12:29

コメントありがとうございます、承知を致しました。
mpyw

2017/05/06 13:05

Chromeは気を効かせてフォームの内容保持してくれますよね
kei344

2017/05/06 14:37

To: mpywさん Cache-Control or http-equiv="Expires" で保存するかを判断しているらしいです。(未検証) で、IE10+は特定条件下でそれも無視して消すことがあるようです。 【ニューヨークITブログ » HTMLのFormへ、戻るボタン(Back)で戻ると内容が消える問題】 http://mirai-it.com/blog/?p=677 【IE11で入力フォームの値がhistory.backで消える不具合に関して | IT関連 | のりべーす】 http://www.noribase.net/2016081358
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問