前提・実現したいこと
詳細ページへのリンクを設定した一覧ページを制作しています。
一覧の数が多いため、もっと見るボタンを設置しボタンを押すとさらに表示される仕様にしています。
詳細ページは同一窓で開くようにしたいです。
詳細ページには一覧ページにもどるためのリンクを設定しています。
詳細ページから、一覧ページにもどるボタンを押した時とブラウザバックで一覧に戻った時に、元のスクロール値を維持したいです。
https://teratail.com/questions/121347
こちらで解決されている方法で初期設定で表示されている一覧のリンク先はスクロール値が取れるのですが
選択タブと、もっと見るで表示されるリンクに飛んだ場合に、もっと見るを表示した状態を保持する方法がわからず困っております。
localStorageを使用しjsonで複数データの保存なども試したのですがうまくいきません、、、
javascriptは勉強中で色々な方のソースを参考に組み合わせているので
書いてる自分でももはやよくわからなくなってしまっています。
長くなってしまい分かりにくい文になってしまい恐縮ですが、良い方法があればどなたか教えてください。
よろしくお願いします。
html
1 <div class="serchBox"> 2 <ul id="Tab" class="nav nav-tabs"> 3 <li class="active"><a href="#tab1">tab1</a></li> 4 <li><a href="#tab2">tab2</a></li> 5 <li><a href="#tab3">tab3</a></li> 6 </ul> 7 </div> 8 9 <div class="tab-content"> 10 11 <div class="tab-pane active" id="tab1"> 12 <div class="box"><a href="#">詳細リンク</a></div> 13 <div class="box"><a href="#">詳細リンク</a></div> 14 <div class="box"><a href="#">詳細リンク</a></div> 15 <!-- /以下略 --> 16 <div id="more_btn">もっと見る <i class="fa fa-chevron-down" aria-hidden="true"></i></div> 17 <div id="close_btn">表示数を戻す <i class="fa fa-chevron-up" aria-hidden="true"></i></div> 18 </div> 19 20 <div class="tab-pane" id="tab2"> 21 <div class="box"><a href="#">詳細リンク</a></div> 22 <div class="box"><a href="#">詳細リンク</a></div> 23 <div class="box"><a href="#">詳細リンク</a></div> 24 <!-- /以下略 --> 25 <div id="more_btn">もっと見る <i class="fa fa-chevron-down" aria-hidden="true"></i></div> 26 <div id="close_btn">表示数を戻す <i class="fa fa-chevron-up" aria-hidden="true"></i></div> 27 </div> 28 29 <div class="tab-pane" id="tab3"> 30 <div class="box"><a href="#">詳細リンク</a></div> 31 <div class="box"><a href="#">詳細リンク</a></div> 32 <div class="box"><a href="#">詳細リンク</a></div> 33 <!-- /以下略 --> 34 <div id="more_btn">もっと見る <i class="fa fa-chevron-down" aria-hidden="true"></i></div> 35 <div id="close_btn">表示数を戻す <i class="fa fa-chevron-up" aria-hidden="true"></i></div> 36 </div> 37 38 </div>
javascript
1$(".tab-pane.active #close_btn").click(function() { 2 $(".tab-content>.active").find(".box:gt("+indexNum+")").slideUp(); 3 $(this).hide(); 4 $(".tab-pane.active #more_btn").show(); 5 }); 6/* ========================================================================== 7 絞り込みデフォルト表示用 8 ========================================================================== */ 9 $(function() { 10 var $numberListLen = $(".tab-content>.active .box").length; 11 var defaultNum = 20; 12 var addNum = 8; 13 var currentNum = 0; 14 15 $(".tab-content>.active").each(function() { 16 $(this).find("#more_btn").show(); 17 $(this).find("#close_btn").hide(); 18 $(this).find(".box:not(:lt("+defaultNum+"))").hide(); 19 20 currentNum = defaultNum; 21 22 $("#more_btn").click(function() { 23 currentNum += addNum; 24 25 $(".tab-content>.active").find(".box:lt("+currentNum+")").slideDown(); 26 27 if($numberListLen <= currentNum) { 28 currentNum = defaultNum; 29 indexNum = currentNum - 1; 30 31 $("#more_btn").hide(); 32 $("#close_btn").show(); 33 34 $("#close_btn").click(function() { 35 $(".tab-content>.active").find(".box:gt("+indexNum+")").slideUp(); 36 $(this).hide(); 37 $("#more_btn").show(); 38 }); 39 } 40 }); 41 }); 42 }); 43 44$('#Tab a').click(function (e) { 45 e.preventDefault(); 46 $(this).tab('show'); 47}); 48 49/* ========================================================================== 50 絞り込みタブ選択後表示用 51 ========================================================================== */ 52$(function () { 53$("#Tab a").click(function () { 54 55 $(".tab-pane.active").each(function() { 56 var $numberListLen = $(".tab-content>.active .box").length; 57 var defaultNum = 20; 58 var addNum = 8; 59 var currentNum = 0; 60 61 $(this).find("#more_btn").show(); 62 $(this).find("#close_btn").hide(); 63 $(this).find(".box:not(:lt("+defaultNum+"))").hide(); 64 65 currentNum = defaultNum; 66 67 $(".tab-pane.active #more_btn").click(function() { 68 currentNum += addNum; 69 70 $(".tab-content>.active").find(".box:lt("+currentNum+")").slideDown(); 71 72 if($numberListLen <= currentNum) { 73 currentNum = defaultNum; 74 indexNum = currentNum - 1; 75 76 $(".tab-pane.active #more_btn").hide(); 77 $(".tab-pane.active #close_btn").show(); 78 79 $(".tab-pane.active #close_btn").click(function() { 80 $(".tab-content>.active").find(".box:gt("+indexNum+")").slideUp(); 81 $(this).hide(); 82 $(".tab-pane.active #more_btn").show(); 83 }); 84 } 85 }); 86 }); 87}); 88}); 89 90/* ========================================================================== 91 ローカルストレージ 92 ========================================================================== */ 93$(".tab-content>.active a").click(function(){ 94 var scrollPos= $(document).scrollTop(); 95localStorage.setItem('key',scrollPos); 96}); 97$(document).ready(function(){ 98var pos = localStorage.getItem('key'); 99$('html,body').animate({ scrollTop: pos }, 'slow'); 100localStorage.clear(); 101}); 102
------------------------------追記------------------------------
質問の範囲が広すぎました。すみません。
・スクロール値を保持
・liのアクティブを保持
・もっと見るのカウントを保持
この3つに分けてまずは試してみようと思います!
上記のJSの下に下記を追記して、liのアクティブを保持はできたのですが、そうするともっと見るのボタンが機能せず、全件表示の状態となってしまいます。
書き方や順番など変えてみたのですがうまくいきません。。。
また、一応アクティブを保持はできているのですが似たような記述を繰り返している気がするので、もっと他に書き方などありましたら教えて頂きたいです。
よろしくお願いします。
javascript
1$(window).on('click',function(){ 2 $("#Tab li.active a").each(function() { 3 var activeli2 = $('#Tab li.active a').index('#Tab li a'); 4 localStorage.setItem('key',activeli2); 5 console.log(activeli2 + '番目を選択'); 6 }); 7}); 8 9 $(window).on('load',function(){ 10 var ref = document.referrer; 11 var domein = "sample.com"; 12 if(ref.indexOf('sample') != -1&&document.URL.match(/sample/)){ 13 var pos = localStorage.getItem('key'); 14 console.log(pos + '番目を選択'); 15 $('#Tab li').removeClass('active'); 16 $('.tab-content>.tab-pane').removeClass('active'); 17 $('#Tab li:eq(' + pos + ')').addClass('active'); 18 $('.tab-content>.tab-pane:eq(' + pos + ')').addClass('active'); 19 20 if(!($('.active').length)){ 21 $('#Tab li').eq(0).addClass('active'); 22 $('.tab-content>.tab-pane').eq(0).addClass('active'); 23 } 24 localStorage.clear(); 25 } 26 });