お世話になっております。
JQueryとJavaScriptでチェックボックスの絞り込みと、ボタンでの並び替えの混在を行いたいのですが、破壊的メソッドのためか、ボタンの並び替えを行うと、チェックボックスでの絞り込みが行えなくなります。
非破壊的メソッドで対応できるかと、
JavaScript
1``` price_arr.slice().sort( 2age_arr.slice().sort( 3としましたが、絞り込みも並び替えも動かなくなります。 4 5どうすれば、チェックボックスの絞り込みと、ボタンでの並び替えの混在させることができるでしょうか。。。。
特性の絞り込みは、チェックボックスを選択すると、classから特定のものを検出して表示させるようにしています。
ボタン並び替えは、.sortで行いっています。
<div class="narabi"> ...</div> が要素のひとかたまりです。以下コードです。
html
1 <h3>特性から絞り込み 2 </h3> 3 <div class="price-tex"> 4 <input type="checkbox" id="Feature1" data-group="0"><label for="Feature1">F1</label> 5 <input type="checkbox" id="Feature2" data-group="0"><label for="Feature2">F2</label> 6 <input type="checkbox" id="Feature3" data-group="0"><label for="Feature3">F3</label> 7 <input type="checkbox" id="Feature4" data-group="0"><label for="Feature4">F4</label> 8 </div> 9 </div> 10 <button id="price"> 11 price順 12 </button> 13 <button id="age"> 14 age数順 15 </button> 16 17 <div class="price-w-img"> 18 <div class="narabi"> 19 <div style="border: 1px solid;" class="col Feature1 Feature2 Feature3 Feature4"> 20 <div class="paint-title">タイトル</span></div> 21 <div class="point-box"> 22 23 <div class="chara"> 24 <p>特性</p> 25 <ul> 26 <li>リスト</li> 27 <li>リスト</li> 28 <li>リスト</li> 29 <li>リスト</li> 30 </ul> 31 </div> 32 </div> 33 <div> 34 <p class="descrip">ディスクリプション</p> 35 </div> 36 <table class="space"> 37 <thead> 38 <tr> 39 <th>age数</th> 40 <th>1</th> 41 <th>2</th> 42 <th>3</th> 43 <th>4</th> 44 </tr> 45 </thead> 46 <tbody> 47 <tr> 48 <td><span class="age" name="15">15</span>~20</td> 49 <td><span class="price" name="799">799</span>,</td> 50 <td>829,</td> 51 <td>899,</td> 52 <td>1,098,</td> 53 </tr> 54 </tbody> 55 </table> 56 </div> 57 </div> 58 <div class="narabi"> 59 <div style="border: 1px solid;" class="col Feature1 Feature4 Feature5"> 60 <div class="paint-title">タイトル</span></div> 61 <div class="point-box"> 62 63 <div class="chara"> 64 <p>特性</p> 65 <ul> 66 <li>リスト</li> 67 <li>リスト</li> 68 <li>リスト</li> 69 <li>リスト</li> 70 </ul> 71 </div> 72 </div> 73 <div> 74 <p class="descrip">ディスクリプション</p> 75 </div> 76 <table class="space"> 77 <thead> 78 <tr> 79 <th>age数</th> 80 <th>1</th> 81 <th>2</th> 82 <th>3</th> 83 <th>4</th> 84 </tr> 85 </thead> 86 <tbody> 87 <tr> 88 <td><span class="age" name="20">20</span>以上</td> 89 <td><span class="price" name="674">674,</span></td> 90 <td>708,</td> 91 <td>787,</td> 92 <td>956,</td> 93 </tr> 94 </tbody> 95 </table> 96 97 </div> 98 </div> 99 </div> 100
JavaScript
1 <script> 2 $(function () { 3 var active = []; 4 var allArr = []; 5 var showClass, 6 href, 7 param = ''; 8 var activeClass = 'active', 9 sortControl = $('.price-tex'), 10 sortTarget = $('.narabi > .col'), 11 groupLength = 1; 12 13 if (location.search) { 14 var onload = location.search.slice(1).replace(/group.=/g, "").split('?'); 15 var defArr = []; 16 for (var i = 0; i < onload.length; i++) { 17 var filter = onload[i].split(','); 18 defArr.push(filter); 19 } 20 var defCheck = '#' + defArr.join(',').replace(/,/g, ',#'); 21 $(defCheck).prop('checked', 'checked'); 22 defArr = '.' + defArr.join('|.').replace(/,/g, ',.'); 23 defArr = defArr.split('|'); 24 showClass = sortTarget; 25 for (var i = 0; i < defArr.length; i++) { 26 var filter = defArr[i]; 27 showClass = showClass.filter(filter); 28 } 29 showClass.addClass(activeClass); 30 sortTarget.each(function () { 31 if ($(this).hasClass(activeClass)) { 32 $(this).show(); 33 } else { 34 $(this).hide(); 35 } 36 }); 37 38 } else { 39 sortTarget.find('.col').addClass('active'); 40 } 41 42 sortControl.find('input[type="checkbox"]').change(function () { 43 active = []; 44 allArr = []; 45 param = ''; 46 for (i = 0; i < groupLength; i++) { 47 var arr = []; 48 var filterArr = []; 49 if (sortControl.find('input[type="checkbox"][data-group="' + i + '"]:checked').length) { 50 sortControl.find('input[type="checkbox"][data-group="' + i + '"]:checked').each( 51 function () { 52 arr.push($(this).attr('id')); 53 filterArr.push('.' + $(this).attr('id')); 54 }); 55 } 56 active[i] = arr; 57 if (filterArr.length) { 58 allArr.push(filterArr); 59 } 60 param += (active[i].length) ? '?group' + i + '=' + active[i] : ''; 61 } 62 63 showClass = sortTarget; 64 65 if (allArr.length) { 66 for (j = 0; j < allArr.length; j++) { 67 var filter = allArr[j].join(','); 68 showClass = showClass.filter(filter); 69 } 70 } 71 72 if ($.isEmptyObject(param) !== true) { 73 history.pushState(null, null, param); 74 } 75 if (sortControl.find('input[type="checkbox"]:checked').length) { 76 sortTarget.removeClass(activeClass); 77 showClass.addClass(activeClass); 78 sortTarget.each(function () { 79 if ($(this).hasClass(activeClass)) { 80 if (!$(this).is(':visible')) { 81 $(this).show().css({ 82 'z-index': '1' 83 }).animate({ 84 'z-index': '100' 85 }, { 86 duration: 300, 87 step: function (now) { 88 $(this).css({ 89 transform: 'scale(' + now / 100 + 90 ')' 91 }); 92 } 93 }); 94 } 95 } else { 96 $(this).css({ 97 'z-index': '100' 98 }).animate({ 99 'z-index': '0' 100 }, { 101 duration: 300, 102 step: function (now) { 103 $(this).css({ 104 transform: 'scale(' + now * 0.01 + ')' 105 }); 106 }, 107 complete: function () { 108 $(this).hide(); 109 } 110 }); 111 } 112 }); 113 } else { 114 sortTarget.show().addClass(activeClass).show().css({ 115 'z-index': '1' 116 }).animate({ 117 'z-index': '100' 118 }, { 119 duration: 300, 120 step: function (now) { 121 $(this).css({ 122 transform: 'scale(' + now / 100 + ')' 123 }); 124 } 125 }); 126 var defHref = location.href.replace(/?.*$/, ""); 127 history.pushState(null, null, defHref); 128 } 129 }); 130 }); 131 </script> 132 <!--ここまで特性分類--> 133 <script> 134 var price_arr = []; 135 136 $("#price").bind("click", function () { 137 $("div.narabi").each(function (i) { 138 139 //価格ごとに連想配列にして配列に追加 140 price_arr[i] = { 141 name: $(this).find(".price").text(), 142 source: $(this).html() 143 }; 144 145 }); 146 147 //配列を並び替え 148 price_arr.sort( 149 function (a, b) { 150 var a_name = a.name; 151 var b_name = b.name; 152 if (a_name < b_name) return -1; 153 if (a_name > b_name) return 1; 154 return 0; 155 }); 156 157 //配列を出力 158 for (var j = 0; j < price_arr.length; j++) { 159 $("div.narabi").eq(j).html(price_arr[j].source); 160 } 161 162 }); 163 </script> 164
age_arrはprice_arrと同じ記述
何卒、お力添えのほどよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー