前提・実現したいこと
以下のコードで絞り込み検索を実装したいと考えています。
https://codepen.io/rustybailey/pen/GJjvYB
ただ、カスタマイズをしたいのですがそのいい方法が思い浮かばず悩んでいます。
ご教示いただけると幸いです。
1.フィルターは3つ用意したい。
・CodePenではフィルターは1つですが、A、B、C、3つ用意したいです。
・単純に3回コードを繰り返して書いてみたのですが、不格好でなにか他にいい方法がないかお聞きしたいです。
2.「または」「かつ」を変更したい
・現状、チェックした要素すべてに一致するものの結果が返ってきますが、どれかに一致するものを結果として返したいです。
・逆にA,B,Cの要素それぞれに対しては「かつ」で結果を返したいです。
以下は、CodePenでのコードを基に自分で作成したコードです。
JavaScriptについては初心者のため、PHPも多少使っていますが、JavaScriptのみでの方法でもPHPを併用した方法でもどちらでも大丈夫です。
ご回答の際は、以下のソースコードを基本にご回答いただけると助かります。
該当のソースコード
html
1<form method="GET" action="<?php echo get_site_url().'/house-makers'; ?>"> 2<div class="row"> 3<?php 4$maker_options = array('施工エリア' => 'area', '取扱い工法' => 'method', '参考坪単価' => 'price'); 5foreach ($maker_options as $key => $maker_option) {?> 6 <div class="col-xs-12 col-sm-12 col-md-12 col-lg-4"> 7 <div class="dropdown-container"> 8 <div class="dropdown-button-<?php echo $maker_option; ?> noselect"> 9 <div class="dropdown-label"><?php echo $key; ?></div> 10 <div class="dropdown-quantity">(<span class="quantity">Any</span>)</div> 11 <i class="fa fa-filter"></i> 12 </div> 13 <div class="dropdown-list" style="display: none;"> 14 <input type="search" placeholder="<?php echo $key; ?>を検索" class="dropdown-search"/> 15 <ul class="ul-dropdown"></ul> 16 </div> 17 </div> 18</div> 19<?php } ?> 20<div class="w-100 p-4"> 21<center><input type="submit" value="検索" class="btn w-50"></center> 22</div> 23</form>
JavaScript
1// Filter Search 2jQuery( document ).ready( function( $ ) { 3$('.dropdown-container').eq(0). 4on('click', '.dropdown-button-area', function () { 5 $('.dropdown-list').eq(0).toggle(); 6}). 7on('input', '.dropdown-search:eq(0)', function () { 8 var target = $(this); 9 var search = target.val(); 10 11 if (!search) { 12 $('.li-dropdown-area').show(); 13 return false; 14 } 15 16 $('.li-dropdown-area').each(function () { 17 var text = $(this).text(); 18 var match = text.indexOf(search) > -1; 19 $(this).toggle(match); 20 }); 21}). 22on('change:eq(1)', '[type="checkbox"]', function () { 23 var numChecked = $('[type="checkbox"]:checked').length; 24 $('.quantity').eq(0).text(numChecked || 'Any'); 25}); 26}); 27 28// JSON of States for demo purposes 29 30var areaCity = [ 31{ name: 'A市', slugArea: 'asi' }, 32{ name: 'B市', slugArea: 'bsi' }, 33{ name: 'C市', slugArea: 'csi' }, 34{ name: 'D市', slugArea: 'dsi' }, 35{ name: 'E市', slugArea: 'esi' }]; 36 37// <li> template 38var areaTemplate = _.template( 39'<li class="li-dropdown-area">' + 40'<label for="<%= slugArea %>">' + 41'<input name="area[]" type="checkbox" value="<%= slugArea %>">' + 42'<%= capName %></label>' + 43'</li>'); 44 45 46// Populate list with states 47jQuery( document ).ready( function( $ ) { 48 _.each(areaCity, function (s) { 49 s.capName = s.name; 50 $('.ul-dropdown').eq(0).append(areaTemplate(s)); 51}); 52} ); 53//# sourceURL=pen.js 54 55jQuery( document ).ready( function( $ ) { 56$('.dropdown-container').eq(1). 57on('click', '.dropdown-button-method', function () { 58 $('.dropdown-list').eq(1).toggle(); 59}). 60on('input', '.dropdown-search:eq(1)', function () { 61 var target = $(this); 62 var search = target.val(); 63 64 if (!search) { 65 $('.li-dropdown-method').show(); 66 return false; 67 } 68 69 $('.li-dropdown-method').each(function () { 70 var text = $(this).text(); 71 var match = text.indexOf(search) > -1; 72 $(this).toggle(match); 73 }); 74}). 75on('change', '[type="checkbox"]', function () { 76 var numChecked = $('[type="checkbox"]:checked').length; 77 $('.quantity').eq(1).text(numChecked || 'Any'); 78}); 79}); 80 81 82var methodType = [ 83{ name: '2×4、2×6', slugMethod: '2x4-2x6' }, 84{ name: '木造軸組', slugMethod: 'wooden' }, 85{ name: '軽量鉄骨', slugMethod: 'light_gauge_steel' }, 86{ name: '重量鉄骨', slugMethod: 'heavy_gauge_steel' }, 87{ name: 'RC', slugMethod: 'rc' }, 88{ name: 'コンクリート系プレハブ', slugMethod: 'concrete-prefub' }, 89{ name: ' 木質系プレハブ', slugMethod: 'wooden-prefub' }, 90{ name: '鉄骨系プレハブ', slugMethod: 'steel-prefub' }]; 91 92 93 94var methodTemplate = _.template( 95'<li class="li-dropdown-method">' + 96'<label for="<%= slugMethod %>">' + 97'<input name="methods[]" type="checkbox" value="<%= slugMethod %>">' + 98'<%= capName %></label>' + 99'</li>'); 100 101jQuery( document ).ready( function( $ ) { 102 _.each(methodType, function (s) { 103 s.capName = s.name; 104 $('.ul-dropdown').eq(1).append(methodTemplate(s)); 105}); 106}); 107 108//# sourceURL=pen.js 109 110 111 112jQuery( document ).ready( function( $ ) { 113$('.dropdown-container').eq(2). 114on('click', '.dropdown-button-price', function () { 115 $('.dropdown-list').eq(2).toggle(); 116}). 117on('input', '.dropdown-search:eq(2)', function () { 118 var target = $(this); 119 var search = target.val(); 120 121 if (!search) { 122 $('.li-dropdown-price').show(); 123 return false; 124 } 125 126 $('.li-dropdown-price').each(function () { 127 var text = $(this).text(); 128 var match = text.indexOf(search) > -1; 129 $(this).toggle(match); 130 }); 131}). 132on('change:eq(2)', '[type="checkbox"]', function () { 133 var numChecked = $('[type="checkbox"]:checked').length; 134 $('.quantity').eq(2).text(numChecked || 'Any'); 135}); 136}); 137 138var priceRange = [ 139{ name: '20万円台', slugPrice: '20' }, 140{ name: '30万円台', slugPrice: '30' }, 141{ name: '40万円台', slugPrice: '40' }, 142{ name: '50万円台', slugPrice: '50' }, 143{ name: '60万円台', slugPrice: '60' }, 144{ name: '70万円台以上', slugPrice: '70' }]; 145 146var priceTemplate = _.template( 147'<li class="li-dropdown-price">' + 148'<label for="<%= slugPrice %>">' + 149'<input name="price[]" type="checkbox" value="<%= slugPrice %>">' + 150'<%= capName %></label>' + 151'</li>'); 152 153jQuery( document ).ready( function( $ ) { 154 _.each(priceRange, function (s) { 155 s.capName = s.name; 156 $('.ul-dropdown').eq(2).append(priceTemplate(s)); 157}); 158}); 159 160//# sourceURL=pen.js
JavaScriptについては初心者で初歩的な質問であれば恐縮です。
よろしくお願いいたします。
あなたの回答
tips
プレビュー