ラジオボタン(製品カテゴリ)とチェックボックス(製品サイズ)にて製品を絞り込める一覧ページを構築しました。
ラジオボタン・チェックボックスによる絞り込み実装はなんとかできたのですが、遷移先ページにてブラウザの戻るボタンで一覧ページに戻った時の表示に関し、ブラウザごとに違いが出てしまいます。
Firefox:遷移直前の製品が絞り込まれた状態を表示(理想)
Chrome:各ボタンにチェックはされているが、表示されている製品が絞り込まれていない(全表示)状態が表示。
Edge:checked指定項目以外は何も選択されていない初期状態が表示
応急処置としてwindow.onpageshowを用い、ブラウザバック=初期状態とさせて挙動を均一化させておりますが、理想としてはFirefox以外のブラウザも直前の選択状態を保持した状態で一覧ページに戻らせたいです。
色々と調べたところsessionStorageを上手く使えば実現できそうな気はしてるのですが、今回のケースに適したkeyやvalueの設定・記述方法がよく分からず、質問させていただいた次第です。
こちらの知識不足申し訳ございませんがご教示いただけますと幸いです。
何卒よろしくお願いいたします。
該当のソースコード
html
1<!--ラジオボタン・チェックボックス--> 2<form> 3 <div class="search-box category_search_box"> 4 <label> 5 <input type="radio" name="category" value="" checked="checked" class="radio_input"> 6 <span class="radio_btn">全ての製品</span></label> 7 <label> 8 <input type="radio" name="category" value="ビジネス向け" class="radio_input"> 9 <span class="radio_btn">ビジネス向け</span></label> 10 <label> 11 <input type="radio" name="category" value="一般向け" class="radio_input"> 12 <span class="radio_btn">一般向け</span></label> 13 </div> 14 <div class="search-box size_search_box"> 15 <label> 16 <input type="checkbox" name="size" value="15インチ" class="checkbox_input"> 17 <span class="checkbox_parts">15インチ</span></label> 18 <label> 19 <input type="checkbox" name="size" value="14インチ" class="checkbox_input"> 20 <span class="checkbox_parts">14インチ</span></label> 21 <label> 22 <input id="checkAll" type="checkbox" name="size" value="" class="checkbox_input"> 23 <span class="checkbox_parts">全サイズ選択</span></label> 24 </div> 25</form> 26<!--製品リスト--> 27<div class="list"> 28 <ul class="list_item" data-category="ビジネス向け" data-size="15インチ"> 29 <li><a href="製品ページA"><img src="製品画像A.jpg" alt="製品A"></a></li> 30 <li> 31 <h2>製品A</h2> 32 </li> 33 </ul> 34 <ul class="list_item" data-category="一般向け" data-size="15インチ"> 35 <li><a href="製品ページB"><img src="製品画像B.jpg" alt="製品B"></a></li> 36 <li> 37 <h2>製品B</h2> 38 </li> 39 </ul> 40 <ul class="product_item list_item" data-category="ビジネス向け" data-size="14インチ"> 41 <li><a href="製品ページC"><img src="製品画像C.jpg" alt="製品C"></a></li> 42 <li> 43 <h2>製品C</h2> 44 </li> 45 </ul> 46 <ul class="product_item list_item" data-category="一般向け" data-size="14インチ"> 47 <li><a href="製品ページD"><img src="製品画像D.jpg" alt="製品D"></a></li> 48 <li> 49 <h2>製品D</h2> 50 </li> 51 </ul> 52</div>
JavaScript
1<script> 2var searchBox = '.search-box'; 3var listItem = '.list_item'; 4var hideClass = 'is-hide'; 5var checkAll = '#checkAll'; 6var checkBox = 'input[name="size"]'; 7 8$(function() { 9 $(document).on('change', searchBox + ' input', function() { 10 search_filter(); 11 }); 12}); 13 14$( checkAll ).on('click', function() { 15 $( checkBox ).prop('checked', $(this).is(':checked') ); 16 }); 17 18 $( checkBox ).on( 'click', function() { 19 var boxCount = $( checkBox ).length; 20 var checked = $( checkBox + ':checked' ).length; 21 if( checked === boxCount ) { 22 $( checkAll ).prop( 'checked', true ); 23 } else { 24 $( checkAll ).prop( 'checked', false ); 25 } 26 }); 27 28function search_filter() { 29 $(listItem).removeClass(hideClass); 30 for (var i = 0; i < $(searchBox).length; i++) { 31 var name = $(searchBox).eq(i).find('input').attr('name'); 32 var searchData = get_selected_input_items(name); 33 if(searchData.length === 0 || searchData[0] === '') { 34 continue; 35 } 36 for (var j = 0; j < $(listItem).length; j++) { 37 var itemData = get_setting_values_in_item($(listItem).eq(j), name); 38 var check = array_match_check(itemData, searchData); 39 if(!check) { 40 $(listItem).eq(j).addClass(hideClass); 41 } 42 } 43 } 44} 45 46function get_selected_input_items(name) { 47 var searchData = []; 48 $('[name=' + name + ']:checked').each(function() { 49 searchData.push($(this).val()); 50 }); 51 return searchData; 52} 53function get_setting_values_in_item(target, data) { 54 var itemData = target.data(data); 55 if(!Array.isArray(itemData)) { 56 itemData = [itemData]; 57 } 58 return itemData; 59} 60function array_match_check(arr1, arr2) { 61 var arrCheck = false; 62 for (var i = 0; i < arr1.length; i++) { 63 if(arr2.indexOf(arr1[i]) >= 0) { 64 arrCheck = true; 65 break; 66 } 67 } 68 return arrCheck; 69} 70</script>
試したこと
取り急ぎ各ブラウザの挙動を統一したく、不本意ながらブラウザバック=ページリフレッシュの対応中。
JavaScript
1<script> 2 window.onpageshow = function(){ 3 document.getElementById("selectForm").reset(); 4 }; 5</script>
回答2件
あなたの回答
tips
プレビュー