teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

記述の修正

2019/04/09 06:08

投稿

a2s
a2s

スコア40

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,7 @@
1
1
  ### 前提・実現したいこと
2
2
  jQueryを使用して、
3
3
 
4
- ①最初の5件が表示された状態
4
+ ①最初の10件が表示された状態
5
5
  →「もっと見る」ボタンをクリックするたびに、5件ずつ表示されていく
6
6
  ②チェックボックスでのソート
7
7
  └該当カテゴリの要素が表示され、5件以上ある場合は「もっと見る」ボタンを表示

1

記述追加

2019/04/09 06:07

投稿

a2s
a2s

スコア40

title CHANGED
File without changes
body CHANGED
@@ -13,9 +13,149 @@
13
13
 
14
14
  ①「もっと見る」ボタン用のJSの記述で実装ができた
15
15
  ②ソート用のJSの記述で実装ができた
16
+ →①と②を合わせると、ソートがうまく機能しない。
17
+ →また、ソートしたあと「もっと見る」を押すと、すべての要素が表示されてしまう
16
18
 
19
+ 上手いことできないかと模索しているのですが、お分かりの方が居ましたらご教授いただけると幸いです。
20
+
21
+ ```HTML
22
+ <!DOCTYPE html>
23
+ <html>
24
+ <head>
25
+ <meta charset="utf-8">
26
+ <title>jQuery_sample</title>
27
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
28
+ </head>
29
+ <body>
30
+
31
+ <div class="search-box">
32
+ <input type="checkbox" name="category" value="カテゴリ-01">カテゴリ-01
33
+ <input type="checkbox" name="category" value="カテゴリ-02">カテゴリ-02
34
+ <input type="checkbox" name="category" value="カテゴリ-03">カテゴリ-03
35
+ <input type="checkbox" name="category" value="カテゴリ-04">カテゴリ-04
36
+ <input type="checkbox" name="category" value="カテゴリ-05">カテゴリ-05
37
+ <input type="checkbox" name="category" value="カテゴリ-06">カテゴリ-06
38
+ <input type="checkbox" name="category" value="カテゴリ-07">カテゴリ-07
39
+ <input type="checkbox" name="category" value="カテゴリ-08">カテゴリ-08
40
+ <input type="checkbox" name="category" value="カテゴリ-09">カテゴリ-09
41
+ <input type="checkbox" name="category" value="カテゴリ-10">カテゴリ-10
42
+ <input type="checkbox" name="category" value="カテゴリ-11">カテゴリ-11
43
+ <input type="checkbox" name="category" value="カテゴリ-12">カテゴリ-12
44
+ <input type="checkbox" name="category" value="カテゴリ-13">カテゴリ-13
45
+ <input type="checkbox" name="category" value="カテゴリ-14">カテゴリ-14
46
+ <input type="checkbox" name="category" value="カテゴリ-15">カテゴリ-15
47
+ <input type="checkbox" name="category" value="カテゴリ-16">カテゴリ-16
48
+ <input type="checkbox" name="category" value="カテゴリ-17">カテゴリ-17
49
+ <input type="checkbox" name="category" value="カテゴリ-18">カテゴリ-18
50
+ <input type="checkbox" name="category" value="カテゴリ-19">カテゴリ-19
51
+ <input type="checkbox" name="category" value="カテゴリ-20">カテゴリ-20
52
+ </div>
53
+
54
+ <ul class="list" id="number_list">
55
+ <li class="list_item" data-category='["カテゴリ-13", "カテゴリ-16"]'>Category: カテゴリ-13, カテゴリ-16</li>
56
+ <li class="list_item" data-category='["カテゴリ-14"]'>Category: カテゴリ-14</li>
57
+ <li class="list_item" data-category='["カテゴリ-06", "カテゴリ-19"]'>Category: カテゴリ-06, カテゴリ-19</li>
58
+ <li class="list_item" data-category='["カテゴリ-02", "カテゴリ-10"]'>Category: カテゴリ-02, カテゴリ-10</li>
59
+ <li class="list_item" data-category='["カテゴリ-17", "カテゴリ-20"]'>Category: カテゴリ-17, カテゴリ-20</li>
60
+ <li class="list_item" data-category='["カテゴリ-05"]'>Category: カテゴリ-05</li>
61
+ <li class="list_item" data-category='["カテゴリ-05", "カテゴリ-18"]'>Category: カテゴリ-05, カテゴリ-18</li>
62
+ <li class="list_item" data-category='["カテゴリ-01", "カテゴリ-14"]'>Category: カテゴリ-01, カテゴリ-14</li>
63
+ <li class="list_item" data-category='["カテゴリ-08"]'>Category: カテゴリ-08</li>
64
+ <li class="list_item" data-category='["カテゴリ-05", "カテゴリ-07", "カテゴリ-09", "カテゴリ-17"]'>Category: カテゴリ-05, カテゴリ-07, カテゴリ-09, カテゴリ-17</li>
65
+ <li class="list_item" data-category='["カテゴリ-12"]'>Category: カテゴリ-12</li>
66
+ <li class="list_item" data-category='["カテゴリ-03"]'>Category: カテゴリ-03</li>
67
+ <li class="list_item" data-category='カテゴリ-11'>Category: カテゴリ-11</li>
68
+ <li class="list_item" data-category='["カテゴリ-15", "カテゴリ-04"]'>Category: カテゴリ-15,カテゴリ-04</li>
17
- ①+②で合わせると動かなくなる。
69
+ </ul>
70
+ <button type=button id="more_btn">もっと見る</button>
71
+
72
+ </body>
73
+ </html>
74
+ ```
18
- また、ソートした際
75
+ ```JQuery
76
+ //もっと見る
77
+ var listContents = $("#number_list li").length;
78
+ $("#number_list").each(function(){
79
+ var Num = 10, //最初の表示件数
80
+ gtNum = Num-1;
81
+ $(this).find('#more_btn').show();
82
+ $(this).find("li:not(:lt("+Num+"))").hide();
83
+ $('#more_btn').click(function(){
84
+ Num +=5; //5個ずつ追加
85
+ $(this).parent().find("li:lt("+Num+")").slideDown();
86
+ if(listContents <= Num){
87
+ $('#more_btn').hide();
88
+ }
89
+ });
90
+
91
+ //ソート
92
+ $(document).on('change', searchBox + ' input', function() {
93
+ search_filter();
94
+ });
95
+ });
96
+
19
- ・ソー、「もっと見る」はそれぞれバラバラに実装はできた
97
+ /*** リスの絞り込みを行う*/
98
+ function search_filter() {
99
+ $(listItem).removeClass(hideClass);
100
+ for (var i = 0; i < $(searchBox).length; i++) {
101
+ var name = $(searchBox).eq(i).find('input').attr('name');
102
+ var searchData = get_selected_input_items(name);
103
+ if(searchData.length === 0 || searchData[0] === '') {
104
+ continue;
105
+ }
106
+ for (var j = 0; j < $(listItem).length; j++) {
107
+ var itemData = get_setting_values_in_item($(listItem).eq(j), name);
108
+ var check = array_match_check(itemData, searchData);
20
-  が、併せると動かなくなる
109
+ if(!check) {
110
+ $(listItem).eq(j).addClass(hideClass);
111
+ }
112
+ }
113
+ }
114
+ }
115
+
116
+ /*** inputで選択されている値の一覧を取得する
117
+ * @param{String} name 対象にするinputのname属性の値
118
+ * @return {Array} 選択されているinputのvalue属性の値
119
+ */
120
+ function get_selected_input_items(name) {
121
+ var searchData = [];
122
+ $('[name=' + name + ']:checked').each(function() {
123
+ searchData.push($(this).val());
124
+ });
125
+ return searchData;
126
+ }
127
+
128
+ /*** リスト内のアイテムに設定している値の一覧を取得する
21
- ・さら、ソートした際のカテゴリは引き継がれず、「もっと見る」でべて要素が表示されてしまう
129
+ * @param{Object} target 対象にするアイテムjQueryオブジェクト
130
+ * @param{String} data 対象にするアイテムのdata属性の名前
131
+ * @return {Array} 対象にするアイテムのdata属性の値
132
+ */
133
+ function get_setting_values_in_item(target, data) {
134
+ var itemData = target.data(data);
135
+ if(!Array.isArray(itemData)) {
136
+ itemData = [itemData];
137
+ }
138
+ return itemData;
139
+ }
140
+
141
+ /*** 2つの配列内で一致する文字列があるかどうかを調べる
142
+ * @param{Array} arr1 調べる配列1
143
+ * @param{Array} arr2 調べる配列2
144
+ * @return {Boolean}一致する値があるかどうか
145
+ */
146
+ function array_match_check(arr1, arr2) {
147
+ var arrCheck = false;
148
+ for (var i = 0; i < arr1.length; i++) {
149
+ if(arr2.indexOf(arr1[i]) >= 0) {
150
+ arrCheck = true;
151
+ break;
152
+ }
153
+ }
154
+ return arrCheck;
155
+ }
156
+ ```
157
+ ```CSS
158
+ .is-hide {
159
+ display: none;
160
+ }
161
+ ```