回答編集履歴

4

テキスト修正

2019/06/18 23:04

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -140,7 +140,7 @@
140
140
 
141
141
 
142
142
 
143
- 先ほどの追記2 のコードを修正しました。
143
+ 先ほどの追記2のコードを、なるべくロジックを追いやすくなるように修正しました。
144
144
 
145
145
 
146
146
 

3

テキスト修正

2019/06/18 23:04

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -136,4 +136,114 @@
136
136
 
137
137
 
138
138
 
139
+ ### 追記3
140
+
141
+
142
+
143
+ 先ほどの追記2 のコードを修正しました。
144
+
145
+
146
+
147
+ ```javascript
148
+
149
+ const MENUS_HTML = `
150
+
151
+ <ul class="menus">
152
+
153
+ <li>たべる</li>
154
+
155
+ <li>さわる</li>
156
+
157
+ </ul>
158
+
159
+ `;
160
+
161
+
162
+
163
+
164
+
165
+ $.fn.menus = function(cmd, menus) {
166
+
167
+ switch (cmd) {
168
+
169
+ case 'open':
170
+
171
+ this.addClass('is_click')
172
+
173
+ .after(menus);
174
+
175
+ break;
176
+
177
+ case 'close':
178
+
179
+ this.removeClass('is_click')
180
+
181
+ .siblings('.menus')
182
+
183
+ .remove();
184
+
185
+ break;
186
+
187
+ default:
188
+
189
+ break;
190
+
191
+ }
192
+
193
+ };
194
+
195
+
196
+
197
+
198
+
199
+ $('.E').on('click', function({ target }) {
200
+
201
+ const e = $(target);
202
+
203
+ switch (target.tagName) {
204
+
205
+ case 'BUTTON':
206
+
207
+ if (e.hasClass('is_click')) {
208
+
209
+ e.menus('close');
210
+
211
+ } else {
212
+
213
+ $('.E > .is_click').menus('close');
214
+
215
+ e.menus('open', MENUS_HTML);
216
+
217
+ }
218
+
219
+ break;
220
+
221
+ case 'UL':
222
+
223
+ case 'LI':
224
+
225
+ $('.is_click', this).menus('close');
226
+
227
+ break;
228
+
229
+ default:
230
+
231
+ break;
232
+
233
+ }
234
+
235
+ });
236
+
237
+
238
+
239
+
240
+
241
+ ```
242
+
243
+ - **動作確認用:** [https://jsfiddle.net/jun68ykt/dbz0mknt/5/](https://jsfiddle.net/jun68ykt/dbz0mknt/5/)
244
+
245
+
246
+
247
+
248
+
139
249
  以上、参考になれば幸いです。

2

テキスト修正

2019/06/18 22:45

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
 
44
44
 
45
- ### 追記
45
+ ### 追記1
46
46
 
47
47
 
48
48
 
@@ -51,3 +51,89 @@
51
51
 
52
52
 
53
53
  上記の回答では、ご質問に追加されている補足を満たすものになっていませんでした。追って補足も満たすものを検討します。
54
+
55
+
56
+
57
+ ### 追記2
58
+
59
+
60
+
61
+ 以下で要件を満たせているのではないかと思います。
62
+
63
+
64
+
65
+ ```javascript
66
+
67
+ const openMenu = function(button) {
68
+
69
+ button.after(`
70
+
71
+ <ul class="menus">
72
+
73
+ <li>たべる</li>
74
+
75
+ <li>さわる</li>
76
+
77
+ </ul>`
78
+
79
+ ).addClass('is_click');
80
+
81
+ }
82
+
83
+
84
+
85
+ const closeMenu = function(button) {
86
+
87
+ button
88
+
89
+ .removeClass('is_click')
90
+
91
+ .siblings('.menus')
92
+
93
+ .remove();
94
+
95
+ };
96
+
97
+
98
+
99
+ $('.E').on('click', function(e) {
100
+
101
+ const t = $(e.target);
102
+
103
+ if (t.attr('type') === 'button') {
104
+
105
+ if (t.hasClass('is_click')) {
106
+
107
+ closeMenu(t);
108
+
109
+ } else {
110
+
111
+ closeMenu($('.E > button.is_click'));
112
+
113
+ openMenu(t);
114
+
115
+ }
116
+
117
+ } else if (t.hasClass('menus') || t.parent().hasClass('menus')) {
118
+
119
+ closeMenu($('button', this));
120
+
121
+ }
122
+
123
+ });
124
+
125
+ ```
126
+
127
+
128
+
129
+ 以下は上記のコードを動作確認するために、jsFiddle に上げたものです。動作確認のため、スタイルを追加し、また、ボタンを4個に増やしています。
130
+
131
+
132
+
133
+ - **動作確認用:** [https://jsfiddle.net/jun68ykt/dbz0mknt/3/](https://jsfiddle.net/jun68ykt/dbz0mknt/3/)
134
+
135
+
136
+
137
+
138
+
139
+ 以上、参考になれば幸いです。

1

テキスト修正

2019/06/18 14:15

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -22,14 +22,6 @@
22
22
 
23
23
 
24
24
 
25
-   
26
-
27
-   
28
-
29
-
30
-
31
-
32
-
33
25
  **修正後:**
34
26
 
35
27
  ```javascript
@@ -45,3 +37,17 @@
45
37
 
46
38
 
47
39
  修正前だと、メニューが閉じているときにボタンをクリックしたときにも③のif の中が実行されてしまうので、修正後ではこれを防いでいます。
40
+
41
+
42
+
43
+
44
+
45
+ ### 追記
46
+
47
+
48
+
49
+ @narutonaさん
50
+
51
+
52
+
53
+ 上記の回答では、ご質問に追加されている補足を満たすものになっていませんでした。追って補足も満たすものを検討します。