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

回答編集履歴

4

テキスト修正

2019/06/18 23:04

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -69,7 +69,7 @@
69
69
 
70
70
  ### 追記3
71
71
 
72
- 先ほどの追記2 のコードを修正しました。
72
+ 先ほどの追記2のコードを、なるべくロジックを追いやすくなるように修正しました。
73
73
 
74
74
  ```javascript
75
75
  const MENUS_HTML = `

3

テキスト修正

2019/06/18 23:04

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -67,4 +67,59 @@
67
67
  - **動作確認用:** [https://jsfiddle.net/jun68ykt/dbz0mknt/3/](https://jsfiddle.net/jun68ykt/dbz0mknt/3/)
68
68
 
69
69
 
70
+ ### 追記3
71
+
72
+ 先ほどの追記2 のコードを修正しました。
73
+
74
+ ```javascript
75
+ const MENUS_HTML = `
76
+ <ul class="menus">
77
+ <li>たべる</li>
78
+ <li>さわる</li>
79
+ </ul>
80
+ `;
81
+
82
+
83
+ $.fn.menus = function(cmd, menus) {
84
+ switch (cmd) {
85
+ case 'open':
86
+ this.addClass('is_click')
87
+ .after(menus);
88
+ break;
89
+ case 'close':
90
+ this.removeClass('is_click')
91
+ .siblings('.menus')
92
+ .remove();
93
+ break;
94
+ default:
95
+ break;
96
+ }
97
+ };
98
+
99
+
100
+ $('.E').on('click', function({ target }) {
101
+ const e = $(target);
102
+ switch (target.tagName) {
103
+ case 'BUTTON':
104
+ if (e.hasClass('is_click')) {
105
+ e.menus('close');
106
+ } else {
107
+ $('.E > .is_click').menus('close');
108
+ e.menus('open', MENUS_HTML);
109
+ }
110
+ break;
111
+ case 'UL':
112
+ case 'LI':
113
+ $('.is_click', this).menus('close');
114
+ break;
115
+ default:
116
+ break;
117
+ }
118
+ });
119
+
120
+
121
+ ```
122
+ - **動作確認用:** [https://jsfiddle.net/jun68ykt/dbz0mknt/5/](https://jsfiddle.net/jun68ykt/dbz0mknt/5/)
123
+
124
+
70
125
  以上、参考になれば幸いです。

2

テキスト修正

2019/06/18 22:45

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -20,8 +20,51 @@
20
20
  修正前だと、メニューが閉じているときにボタンをクリックしたときにも③のif の中が実行されてしまうので、修正後ではこれを防いでいます。
21
21
 
22
22
 
23
- ### 追記
23
+ ### 追記1
24
24
 
25
25
  @narutonaさん
26
26
 
27
- 上記の回答では、ご質問に追加されている補足を満たすものになっていませんでした。追って補足も満たすものを検討します。
27
+ 上記の回答では、ご質問に追加されている補足を満たすものになっていませんでした。追って補足も満たすものを検討します。
28
+
29
+ ### 追記2
30
+
31
+ 以下で要件を満たせているのではないかと思います。
32
+
33
+ ```javascript
34
+ const openMenu = function(button) {
35
+ button.after(`
36
+ <ul class="menus">
37
+ <li>たべる</li>
38
+ <li>さわる</li>
39
+ </ul>`
40
+ ).addClass('is_click');
41
+ }
42
+
43
+ const closeMenu = function(button) {
44
+ button
45
+ .removeClass('is_click')
46
+ .siblings('.menus')
47
+ .remove();
48
+ };
49
+
50
+ $('.E').on('click', function(e) {
51
+ const t = $(e.target);
52
+ if (t.attr('type') === 'button') {
53
+ if (t.hasClass('is_click')) {
54
+ closeMenu(t);
55
+ } else {
56
+ closeMenu($('.E > button.is_click'));
57
+ openMenu(t);
58
+ }
59
+ } else if (t.hasClass('menus') || t.parent().hasClass('menus')) {
60
+ closeMenu($('button', this));
61
+ }
62
+ });
63
+ ```
64
+
65
+ 以下は上記のコードを動作確認するために、jsFiddle に上げたものです。動作確認のため、スタイルを追加し、また、ボタンを4個に増やしています。
66
+
67
+ - **動作確認用:** [https://jsfiddle.net/jun68ykt/dbz0mknt/3/](https://jsfiddle.net/jun68ykt/dbz0mknt/3/)
68
+
69
+
70
+ 以上、参考になれば幸いです。

1

テキスト修正

2019/06/18 14:15

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -10,10 +10,6 @@
10
10
  - **動作確認用:** [https://jsfiddle.net/jun68ykt/075drj2f/1/](https://jsfiddle.net/jun68ykt/075drj2f/1/)
11
11
    
12
12
 
13
-   
14
-   
15
-
16
-
17
13
  **修正後:**
18
14
  ```javascript
19
15
  if(e.target.tagName !== 'BUTTON' && !$(e.target).closest('.E > button:not(.is_click)').length) {
@@ -21,4 +17,11 @@
21
17
  - **動作確認用:** [https://jsfiddle.net/jun68ykt/075drj2f/2/](https://jsfiddle.net/jun68ykt/075drj2f/2/)
22
18
 
23
19
 
24
- 修正前だと、メニューが閉じているときにボタンをクリックしたときにも③のif の中が実行されてしまうので、修正後ではこれを防いでいます。
20
+ 修正前だと、メニューが閉じているときにボタンをクリックしたときにも③のif の中が実行されてしまうので、修正後ではこれを防いでいます。
21
+
22
+
23
+ ### 追記
24
+
25
+ @narutonaさん
26
+
27
+ 上記の回答では、ご質問に追加されている補足を満たすものになっていませんでした。追って補足も満たすものを検討します。