質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

1050閲覧

addEventListenerが動作しません。

kahosayshello

総合スコア4

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2020/07/24 15:03

閲覧いただき、ありがとうございます!
JS初心者のウェブデザイナーです。

表題の件につきまして、アコーディオンを素のJSで描こうとしているのですが、
コードにてaddEventListenerが動作せず原因がわからないためお聞きしました。

エラーとしては、下記のエラーが出ます。
index.html:60 Uncaught TypeError: btn.addEventListener is not a function at index.html:60

実際のコードがこちらになります。

<div class="contentsWrap"> <p class="btn">OPEN</p> <ul class="menu"> <li>menu</li> <li>menu02</li> <li>menu03</li> <li>menu04</li> <li>menu05</li> <li>menu06</li> </ul> </div> <script> const btn = document.getElementsByClassName('btn'); const menu = document.querySelector('.menu'); const menuHeight = menu.clientHeight; menu.style.height = '0px'; btn.addEventListener('click', () =>{ console.log("aaa"); if(menu.style.height === '0px'){ menu.style.height = menuHeight + 'px'; }else{ menu.style.height = '0px'; } }); </script> </body>

試したこととしましては、関係ないかとは思っていたのですが、
定数を変数にしてみたりしました。

お手すきの際にご教授いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/24 15:13

jquery の要素がどこに?
guest

回答2

0

getElement"s"ByClassNameの返り値は、HTMLElementではなく、HTMLCollectionなので
そのままでは addEventListenerできません。
中身を一個ずつ取り出してaddEventListenerする必要があります。

<script> const btn = document.getElementsByClassName('btn'); const menu = document.querySelector('.menu'); const menuHeight = menu.clientHeight; menu.style.height = '0px'; console.log(btn); // HTMLCollection Array.prototype.forEach.call(btn, function(element) { console.log(element); element.addEventListener('click', () =>{ console.log("aaa"); if(menu.style.height === '0px'){ menu.style.height = menuHeight + 'px'; }else{ menu.style.height = '0px'; } }); }); </script>

投稿2020/07/24 15:27

YakumoSaki

総合スコア2027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kahosayshello

2020/07/24 16:00

ご丁寧にありがとうございます!!! なるほど…!では高確率でgetElementByIdを使用しておけば大丈夫というイメージでしょうか? HTMLcollectionとHTMLelementの要素について理解していなかったので勉強してgetElementsByClassNameでの取得もできるようにします! 本当にありがとうございます!!
guest

0

ベストアンサー

javascript

1const btn = document.querySelector('.btn');

追記

複数のmenuを想定しているならこんな感じ
OPEN/CLOSEを意識すること。
非表示は高さの設定よりdisplayでやるほうが一般的です。

javascript

1<script> 2window.addEventListener('DOMContentLoaded',()=>{ 3 document.querySelectorAll('.menu').forEach(x=>{ 4 x.style.display="none"; 5 }); 6 document.querySelectorAll('.btn').forEach(x=>{ 7 x.addEventListener('click',e=>{ 8 var flg=x.textContent=="OPEN"; 9 x.nextElementSibling.style.display=flg?"initial":"none"; 10 x.textContent=flg?"CLOSE":"OPEN"; 11 }); 12 }); 13}); 14</script> 15<div class="contentsWrap"> 16<p class="btn">OPEN</p> 17<ul class="menu"> 18<li>menu</li> 19<li>menu02</li> 20<li>menu03</li> 21<li>menu04</li> 22<li>menu05</li> 23<li>menu06</li> 24</ul> 25</div> 26<div class="contentsWrap"> 27<p class="btn">OPEN</p> 28<ul class="menu"> 29<li>menu</li> 30<li>menu02</li> 31<li>menu03</li> 32<li>menu04</li> 33<li>menu05</li> 34<li>menu06</li> 35</ul> 36</div> 37 38</script> 39<div class="contentsWrap"> 40<p class="btn">OPEN</p> 41<ul class="menu"> 42<li>menu</li> 43<li>menu02</li> 44<li>menu03</li> 45<li>menu04</li> 46<li>menu05</li> 47<li>menu06</li> 48</ul> 49</div> 50<div class="contentsWrap"> 51<p class="btn">OPEN</p> 52<ul class="menu"> 53<li>menu</li> 54<li>menu02</li> 55<li>menu03</li> 56<li>menu04</li> 57<li>menu05</li> 58<li>menu06</li> 59</ul> 60</div>

投稿2020/07/24 15:22

編集2020/07/24 16:20
yambejp

総合スコア116734

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kahosayshello

2020/07/24 15:25

ありがとうございます!!動作しました!! なぜ、.btnもquerySelectorにしないといけないのでしょうか…? お手数ですが、ご教授いただけますと幸いです;;
yambejp

2020/07/24 15:30

getElementsByClassNameで戻ってくるのはHTMLCollectionといって 配列ライクな複数のHTML要素を集合的に収集します HTMLCollectionはaddEventListenerメソッドを持っていません 一方querySelectorは対象が複数あってもその最初のHTMLElementしか 掴みません。HTMLElementはaddEventListenerが利用できます。
kahosayshello

2020/07/24 16:04

お返事ありがとうございます!!! そうなのですね。querySelectorを使ったjsもあまり拝見したことがなかったのはその理由だったからなんですね。先ほど、アコーディオンのDOM要素を下にもう一つ増やして確認してみたのですが、下の方は動作しませんでした。 HTMLCollection等について勉強しっかりします! ありがとうございました!!
kahosayshello

2020/07/25 03:08

追記までいただき、ありがとうございます!!>< なるほど。displayで行うのが一般的なのですね! まだまだわからない構文がたくさんありますので、今日勉強します! 本当にありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問