🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
jQuery

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

Q&A

解決済

1回答

1007閲覧

ハッシュタグのページ遷移で、戻るボタンを設置したい。

koume5

総合スコア1

jQuery

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

0グッド

0クリップ

投稿2020/12/06 20:59

前提・実現したいこと

YES NO で進んでいくような診断テストを作っています。
こちらで同じような質問を見て、参考にさせていただき、推移元が決まっている場合には問題なくできました。
ただ、推移元が複数ある場合、どこから推移してきたのかあらかじめ知ることができないので、困っています。

発生している問題・エラーメッセージ

コードで言うと、「結果」のところで、「戻る」ボタンを押したときに、「質問2」から来たら「質問2」へ戻るようにしたいのです。
どうぞよろしくお願いします。

該当のソースコード

<script> $(function(){ $(".back").on("click",function(){ back_hash = "q_"+$(this).data("back-qnum"); location.href = location.pathname+"#"+back_hash; $(this).closest("div").css("display","none"); $("#"+back_hash).addClass("active").show("fast"); }); $(".btn").on("click", function() { $(this).closest("div").css("display","none"); id = $(this).attr("href"); $(id).addClass("active").show("fast"); }); }); </script> <div class="qbox"> <div id="q_01" class="active"> <p>質問1</p> <ul> <li><a class="btn" href="#q_02">Yes</a></li> <li><a class="btn" href="#q_03">No</a></li> </ul> </div> <div id="q_02" style="display: none;"> <p>質問2</p> <ul> <li><a class="btn" href="#q_04">Yes</a></li> </ul> </div> <div id="q_03" style="display: none;"> <p>質問3</p> <ul> <li><a class="btn" href="#q_04">Yes</a></li> </ul> </div> <div id="q_04" style="display: none;"> <p>結果</p> <input type="button" value="戻るボタン" class="back" data-back-qnum="01"> </div> </div> ### 試したこと 前のhrefを取得して、ハッシュタグ以降の数字の部分のみ取得し、data-back-qnum="" に入れるようにすればいいのかと試したのですが、そもそもページ推移しないhrefを取得する‥ところでもう躓いています。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

.btnをクリックしたときに、親のidを変数に格納しておいて、それに戻るようにすればどうでしょう。

js

1 $(function () { 2 let back_hash; 3 $(".back").on("click", function () { 4 location.href = location.pathname + "#" + back_hash; 5 $(this).closest("div").css("display", "none"); 6 $("#" + back_hash).addClass("active").show("fast"); 7 }); 8 $(".btn").on("click", function () { 9 $(this).closest("div").css("display", "none"); 10 back_hash = $(this).closest("div").attr('id'); 11 id = $(this).attr("href"); 12 $(id).addClass("active").show("fast"); 13 }); 14 });

追記

[戻るボタン]は一つのみで履歴を遡って最初の質問まで戻ることが可能にするコード例

質問の移動履歴を配列に格納してそれを元に戻ります。

html

1<!DOCTYPE html> 2<html lang="ja"> 3 4<head> 5 <meta charset="UTF-8"> 6 <title>タイトル</title> 7 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> 8 <script> 9 $(function () { 10 let hash_history=["#q_01"]; 11 $("#back").on("click", function () { 12 let id = hash_history.pop() 13 $(id).hide(); 14 id = hash_history[hash_history.length - 1]; 15 location.href = location.pathname + id; 16 $(id).addClass("active").show("fast"); 17 if(hash_history.length===1) $("#back").hide(); 18 }); 19 $(".btn").on("click", function () { 20 $(this).closest("div").hide(); 21 if(hash_history.length===1) $("#back").show("fast"); 22 let id = $(this).attr("href"); 23 hash_history.push(id); 24 $(id).addClass("active").show("fast"); 25 }); 26 }); 27 </script> 28</head> 29 30<body> 31 32 <div class="qbox"> 33 <div id="q_01" class="active"> 34 <p>質問1</p> 35 <ul> 36 <li><a class="btn" href="#q_02">Yes</a></li> 37 <li><a class="btn" href="#q_03">No</a></li> 38 </ul> 39 </div> 40 <div id="q_02" style="display: none;"> 41 <p>質問2</p> 42 <ul> 43 <li><a class="btn" href="#q_04">Yes</a></li> 44 </ul> 45 </div> 46 <div id="q_03" style="display: none;"> 47 <p>質問3</p> 48 <ul> 49 <li><a class="btn" href="#q_04">Yes</a></li> 50 </ul> 51 </div> 52 <div id="q_04" style="display: none;"> 53 <p>結果</p> 54 </div> 55 <input type="button" value="戻るボタン" id="back" style="display: none;"> 56 </div>

投稿2020/12/07 02:36

編集2020/12/09 03:13
hatena19

総合スコア34073

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

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

koume5

2020/12/07 16:40 編集

ありがとうございます! 無事、前の質問に戻ることが出来ました。 この週末ずっと解決策を探して見つからず、途方に暮れていたところでしたのでとても助かりました。 推移する前の親のidを取得とは、考えもつかなかったです。 ひとつ質問というか、私の質問のコードが完全でなかったせいなのですが(「質問2」や「質問3」のところに「戻る」ボタンを配置してなかったので)、ひとつ前の質問には戻るのですが、二つ前には戻りません。要するに、順行から来た場合は戻れるのですが、(実際はもっとたくさん質問があります)逆行から戻ってきた場合、推移前の親のidが変ってしまうのですね。 自分でももう少し考えてみますが、お時間ありましたらご教授ください。
koume5

2020/12/08 14:50

結局、ボタンを統一するとうまく動かないので「普通に戻るボタン」と「選択肢がある時のボタン」を分けて作ると思うような結果になりました。 推移元が複数ある個所が増えるとその分ボタンの数を増やさなければいけないので、他にもっとスマートなやり方はあるのかもしれませんが、たぶんこれが今の自分の理解できる限界だと思いますし、なにより出来たことがうれしいです。 hatena19さんにはとても感謝しています! 質問を読んでくださった方も、ありがとうございました。
hatena19

2020/12/08 15:13

とりあえず、戻るボタンをボタンを統一する方法のヒントだけ出しておきます。 戻るボタンは、現状 `#q_04`要素内にありますが、外に出して独立させておきます。 そして、display: none;で非表示にしておきます。 質問1の回答をクリックしたときに戻るボタンを表示させます。(Showメソッドを使うといいでしょう。) また、質問1に戻った時に非表示にします。(hideメソッドを使うといいでしょう。) 上記の処理を現状のコードに追加すれば可能です。
koume5

2020/12/08 18:34 編集

頂いたヒントをもとに考えてみたのですが、やはりボタンが一種類だけだと、「btn」を踏んで進むたびに「back」の内容が更新されて、いくつか進んだ先で逆行してくると、以前の「back」の内容は保持されていない、という考えしかできません。 「back」の内容を更新禁止にできればいいのかな‥。 戻るボタンを外に出すとどんな良いことがあるのか、と考えてみたのですが‥いえもう少し考えてみます。 お忙しいところ、長々とお付き合いありがとうございました。
hatena19

2020/12/09 00:46

推移元を変数ではなく配列に追加していって履歴として残しておく。 戻るときは配列の最後を参照して戻り、配列の最後を削除する。 というようなコーディングにすることになるでしょう。
hatena19

2020/12/09 03:14

上記のサンプルを作成して回答に追記しましたので、参考にしてください。
koume5

2020/12/09 04:19 編集

なるほど!上書きするのではなく、履歴を残して、最初は最終の情報を得て、進んだ分だけ戻る時に削除されれていくから、最終的に最初に踏んだ時の情報を得られるということですね。すごい! でもその説明を頂いたとしても、自分で書くのは難しかったと思います‥これから頂いたコードをじっくり見てみます。 ヒントだけでなくとても丁寧な答えまで頂いてとてもうれしいのですが、ここまでお手数おかけして申し訳ない気持ちでいっぱいです。もっと勉強しないと質問するのも恥ずかしいですね。 いろいろご助言いただいて、考え方の世界が少し広がった感じです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問