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

回答編集履歴

1

解説

2018/03/06 14:30

投稿

yambejp
yambejp

スコア117912

answer CHANGED
@@ -42,4 +42,62 @@
42
42
  </ul>
43
43
  </li>
44
44
  </ul>
45
+ ```
46
+
47
+ # 解説付きひとまとめ
48
+
49
+ ```javascript
50
+ <style>
51
+ .menu{
52
+ width:300px;
53
+ border:solid 1px red;
54
+ }
55
+ .smenu{
56
+ margin:0;
57
+ padding:0;
58
+ }
59
+ </style>
60
+ <script>
61
+ /* DOMツリーの構築を待って発火 */
62
+ window.addEventListener('DOMContentLoaded', function(e){
63
+ /* menuクラスのタグを全部つかむ */
64
+ var menu=document.querySelectorAll(".menu");
65
+ /* menuをぐるっと走査する */
66
+ for(var i=0;i<menu.length;i++){
67
+ var x=menu[i];
68
+ /* menuないにあるsmenuの表示を消す */
69
+ x.querySelector('.smenu').style.display="none";
70
+ /* menuにclickイベントを付加する */
71
+ x.addEventListener('click',function(e){
72
+ /* イベントeを受け取って対象となるtを指定 */
73
+ var t=e.target;
74
+ /* 対象t内にあるsmenuの現在の表示状態をdに保持 */
75
+ var d=t.querySelector('.smenu').style.display;
76
+ /* もしdが"none"だった場合は空に、そうでない場合は"none"に */
77
+ d=(d=="none"?"":"none");
78
+ /* 対象tのsmenuの表示を変更 */
79
+ t.querySelector('.smenu').style.display=d;
80
+ });
81
+ }
82
+ /*
83
+ このforループを代替するのがArray.prototype.forEach.call()構文
84
+ */
85
+ });
86
+ </script>
87
+ <ul>
88
+ <li class="menu">メニュー①
89
+ <ul class="smenu">
90
+ <li>メニュー1</li>
91
+ <li>メニュー2</li>
92
+ <li>メニュー3</li>
93
+ </ul>
94
+ </li>
95
+ <li class="menu">メニュー②
96
+ <ul class="smenu">
97
+ <li>メニュー4</li>
98
+ <li>メニュー5</li>
99
+ <li>メニュー6</li>
100
+ </ul>
101
+ </li>
102
+ </ul>
45
103
  ```