回答編集履歴

3

コードの修正

2021/10/04 07:45

投稿

k_a
k_a

スコア983

test CHANGED
@@ -127,3 +127,27 @@
127
127
 
128
128
 
129
129
  この配列に対して`flat`を書けることで1次元の配列`[headerBtn0,headerBtn1,coverDarken0,coverDarken1]`となり、取得に使用したクラス関係なく一括で`forEach`にかけられるので便利だよね、という感じです。
130
+
131
+
132
+
133
+ ### 追記
134
+
135
+ 今試してみたら`querySelectorAll`は普通に取得条件を配列のまま渡しても要素が取得されました。
136
+
137
+ なのでArrayメソッドでこねくり回さなくても以下の単純なコードで良さそうです。前の回答はArrayメソッドの参考程度に考えて下さい。
138
+
139
+ ```
140
+
141
+ function assignEvent_all(targetClass, ...buttonClasses) {
142
+
143
+ document.querySelectorAll(buttonClasses)
144
+
145
+ .forEach(button => {
146
+
147
+ if (button) button.onclick = () => toggleOpen(targetClass)
148
+
149
+ })
150
+
151
+ }
152
+
153
+ ```

2

質問に対する追記

2021/10/04 07:45

投稿

k_a
k_a

スコア983

test CHANGED
@@ -69,3 +69,61 @@
69
69
  }
70
70
 
71
71
  ```
72
+
73
+
74
+
75
+
76
+
77
+ ### コメントに対する返答
78
+
79
+ > ①document.querySelectorAllで配列で各要素取得
80
+
81
+ > [header__nav-btn, header__nav-btn, header__nav-btn]
82
+
83
+
84
+
85
+ `querySelectorAll`で取得されるのは`NodeList`で配列と似た性質を持ちますが配列とは異なります。
86
+
87
+ 詳しくは[MDN](https://developer.mozilla.org/ja/docs/Web/API/NodeList)などを参照して下さい。
88
+
89
+
90
+
91
+ ---
92
+
93
+ > ②...スプレッド構文で展開
94
+
95
+ > ③配列リテラルで配列化
96
+
97
+
98
+
99
+ ②と③はセットの処理です。
100
+
101
+ `NodeList`→`Array`へ変換するために一度NodeListをNodeに展開しています。NodeListのままでは`map`や`flat`等のArrayインスタンスメソッド全般が使用できません。
102
+
103
+ `Array.from`等を使用しても同等です。
104
+
105
+
106
+
107
+ ---
108
+
109
+ > ④その後cover-darkenクラスがあれば合算していく
110
+
111
+ > [header__nav-btn , header__nav-btn , header__nav-btn , cover-darken]
112
+
113
+
114
+
115
+ 合算という言葉は少し正しくないような気がします(認識は同じかもしれません)
116
+
117
+
118
+
119
+ `[...document.querySelectorAll(".header__nav-btn")]`→`[headerBtn0,headerBtn1]`
120
+
121
+ `[...document.querySelectorAll(".cover-darken")]`→`[coverDarken0,coverDarken1]`
122
+
123
+
124
+
125
+ 上記のように取得要素が取得された場合、`map`メソッドでは2次元の配列(`[[headerBtn0,headerBtn1],[coverDarken0,coverDarken1]]`)が作られます
126
+
127
+
128
+
129
+ この配列に対して`flat`を書けることで1次元の配列`[headerBtn0,headerBtn1,coverDarken0,coverDarken1]`となり、取得に使用したクラス関係なく一括で`forEach`にかけられるので便利だよね、という感じです。

1

掲載コードのミス修正

2021/10/04 07:24

投稿

k_a
k_a

スコア983

test CHANGED
@@ -54,10 +54,6 @@
54
54
 
55
55
  function assignEvent_all(targetClass, ...buttonClasses) {
56
56
 
57
- const target = document.querySelector(targetClass)
58
-
59
-
60
-
61
57
  buttonClasses
62
58
 
63
59
  .map(buttonClass => [...document.querySelectorAll(buttonClass)])
@@ -66,7 +62,7 @@
66
62
 
67
63
  .forEach(button => {
68
64
 
69
- if (button) button.onclick = () => toggleOpen(target)
65
+ if (button) button.onclick = () => toggleOpen(targetClass)
70
66
 
71
67
  })
72
68