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

質問編集履歴

4

追記

2019/08/22 07:22

投稿

Nana66
Nana66

スコア4

title CHANGED
File without changes
body CHANGED
@@ -146,4 +146,6 @@
146
146
  ```
147
147
  が効かなくなってしまいました。
148
148
  表示の切り替えは動作するのですが、もう一度#allボタンを押しても動作しません。
149
+ jQueryで動的にDOMを生成すると、その要素に対してイベントを生成するには通常の方法ではイベントが効かなくなる、ことは調べてわかりました。
150
+ この状態からイベントを発生させる方法について、ご助言いただけますと幸いです。
149
151
  よろしくお願いいたします。

3

追記

2019/08/22 07:22

投稿

Nana66
Nana66

スコア4

title CHANGED
File without changes
body CHANGED
@@ -145,5 +145,5 @@
145
145
  });
146
146
  ```
147
147
  が効かなくなってしまいました。
148
- あいかわらず表示の切り替えは問題なく動作しま
148
+ 表示の切り替えは動作するのですが、もう一度#allボタンを押ても動作しせん
149
149
  よろしくお願いいたします。

2

誤字修正

2019/08/22 07:14

投稿

Nana66
Nana66

スコア4

title CHANGED
File without changes
body CHANGED
@@ -79,7 +79,7 @@
79
79
  });
80
80
 
81
81
  //リストの絞り込み
82
- var searchBox = '.contents__search__box';
82
+ var searchBox = '.search__box';
83
83
  var listItem = '.list__item';
84
84
  var hideClass = 'is-hide';
85
85
 

1

コードの追記

2019/08/22 07:10

投稿

Nana66
Nana66

スコア4

title CHANGED
File without changes
body CHANGED
@@ -28,4 +28,122 @@
28
28
  そのため、表示を切り替えるだけではなく、スタイルの切り替えも行いたいです。
29
29
  色々試してみたのですが、全くもって実装できず…
30
30
  素人でお恥ずかしい限りですが、お力をお貸しいただけると幸いです。
31
+ よろしくお願いいたします。
32
+
33
+ ###追記(試したこと)
34
+ はじめての質問で、勝手がわかっておらず大変失礼いたしました。
35
+ 上記リンクを参考に、自分で書いたコードを追記します。
36
+
37
+ ```HTML
38
+        <div class="contents-wrapper">
39
+ <div class="contents-search">
40
+ <div class="contents-search__wrapper">
41
+ <button id="all">ALL</button>
42
+ <div class="search__box">
43
+ <input type="checkbox" name="category" value="AAA" id="AAA">
44
+ <label for="AAA">AAA</label>
45
+ <input type="checkbox" name="category" value="BBB" id="BBB">
46
+ <label for="BBB">BBB</label>
47
+ <input type="checkbox" name="category" value="CCC" id="CCC">
48
+ <label for="CCC">CCC</label>
49
+ <input type="checkbox" name="category" value="DDD" id="DDD">
50
+ <label for="DDD">DDD</label>
51
+ </div>
52
+ <div class="search__box">
53
+ <input type="checkbox" name="level" value="high" id="high">
54
+ <label class="label" for="high">high</label>
55
+ <input type="checkbox" name="level" value="low" id="low">
56
+ <label class="label" for="low">low</label>
57
+ </div>
58
+ </div>
59
+ </div>
60
+           <ul class="contents__list">
61
+ <li class="list__item" data-category='["AAA"]' data-level='["high"]'></li>
62
+ <li class="list__item" data-category='["AAA"]' data-level='["low"]'></li>
63
+ <li class="list__item" data-category='["BBB"]' data-level='["high"]'></li>
64
+ <li class="list__item" data-category='["BBB"]' data-level='["low"]'></li>
65
+ <li class="list__item" data-category='["CCC"]' data-level='["high"]'></li>
66
+ <li class="list__item" data-category='["DDD"]' data-level='["low"]'></li>
67
+ </ul>
68
+       </div>
69
+
70
+
71
+ ```
72
+
73
+ ```jQuery
74
+ var defaultHTML = $('.contents-wrapper').html();
75
+
76
+ // HTML記述を初期状態に戻す
77
+ $('#all').on('click', function(){
78
+ $('.contents-wrapper').html(defaultHTML);
79
+ });
80
+
81
+ //リストの絞り込み
82
+ var searchBox = '.contents__search__box';
83
+ var listItem = '.list__item';
84
+ var hideClass = 'is-hide';
85
+
86
+ $(document).on('change', searchBox + ' input', function() {
87
+ search_filter();
88
+ });
89
+
90
+ $('label').on('click', function(){
91
+ $(this).toggleClass('is-active');
92
+ });
93
+
94
+ function search_filter() {
95
+ $(listItem).removeClass(hideClass);
96
+ for (var i = 0; i < $(searchBox).length; i++) {
97
+ var name = $(searchBox).eq(i).find('input').attr('name');
98
+ var searchData = get_selected_input_items(name);
99
+ if(searchData.length === 0) {
100
+ continue;
101
+ }
102
+ for (var j = 0; j < $(listItem).length; j++) {
103
+ var itemData = get_setting_values_in_item($(listItem).eq(j), name);
104
+ var check = array_match_check(itemData, searchData);
105
+ if(!check) {
106
+ $(listItem).eq(j).addClass(hideClass);
107
+ }
108
+ }
109
+ }
110
+ }
111
+
112
+ function get_selected_input_items(name) {
113
+ var searchData = [];
114
+ $('[name=' + name + ']:checked').each(function() {
115
+ searchData.push($(this).val());
116
+ });
117
+ return searchData;
118
+ }
119
+
120
+ function get_setting_values_in_item(target, data) {
121
+ var itemData = target.data(data);
122
+ if(!Array.isArray(itemData)) {
123
+ itemData = [itemData];
124
+ }
125
+ return itemData;
126
+ }
127
+
128
+ function array_match_check(arr1, arr2) {
129
+ var arrCheck = false;
130
+ for (var i = 0; i < arr1.length; i++) {
131
+ if(arr2.indexOf(arr1[i]) >= 0) {
132
+ arrCheck = true;
133
+ break;
134
+ }
135
+ }
136
+ return arrCheck;
137
+ }
138
+ ```
139
+
140
+ ALLをクリックで、何にもis-hideクラスがついていない、元のhtmlに書き換えるようにしました。
141
+ これで、表示の切り替えの実装はできたのですが、$('.contents-wrapper').html(defaultHTML); で元のhtmlに書き換えた後のページで
142
+ ```jQuery
143
+ $('label').on('click', function(){
144
+ $(this).toggleClass('is-active');
145
+ });
146
+ ```
147
+ が効かなくなってしまいました。
148
+ あいかわらず表示の切り替えは問題なく動作します。
31
149
  よろしくお願いいたします。