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

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

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

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

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

JavaScript

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

Q&A

解決済

3回答

1147閲覧

addEventListenerのクリックイベントを稼働させたい

Naoki_Pro

総合スコア23

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

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

JavaScript

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

0グッド

1クリップ

投稿2019/09/22 02:13

前提・実現したいこと

HTML/CSS/JavaScriptを使用してwebページの模写をしています。
表示されているディスプレイをJavaScriptのaddEventListenerのクリックイベントで、クリックされたらディスプレイを非表示にしたいのですが実行できません。

エラーメッセージの最後のindex.js:6はJavaScriptのicon.addEventListenerの行です。

発生している問題・エラーメッセージ

Uncaught TypeError: icon.addEventListener is not a function at index.js:6

該当のソースコード

HTML

1<div id="fixed" class="close fixed"> 2 <p>今のところ、ギフトカードはアメリカ移住者のみご購入いただけます。アメリカにお住いの場合は、アカウントの設定から移住地を更新してください。</p> 3 <i class="fas fa-times f-icon"></i> 4 </div>

css

1.close { 2 position: static; 3 display: none; 4} 5.fixed { 6 display: flex; 7 align-items: center; 8 justify-content: flex-start; 9 position: fixed; 10 background-color: rgb(179, 243, 237); 11 width: 100%; 12 height: 50px; 13}

JavaScript

1"use strict"; 2 3let fixed = document.getElementById("fixed"); 4let icon = document.getElementsByClassName("f-icon"); 5 6icon.addEventListener("click", function() { 7 fixed.classList.remove("fixed"); 8});

試したこと

HTMLのdivタグのclass="close"を無くして、
classList.remove("fixed")をclassList.add("close")に変えてdisplayが非表示になるかも試しましたができませんでした。
他にも新しくid/classの付け替えをしましたが動きませんでした。

補足情報(FW/ツールのバージョンなど)

Atom version 1.40.1

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

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

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

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

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

guest

回答3

0

ベストアンサー

javascript中の icon という変数には配列が格納されているようです。

javascript

1console.log(icon) 2>> HTMLCollection [ i.fas.fa-times.f-icon ]

そのため、addeventlistenerの呼び出しに失敗しています。
配列の中から一つ取り出せば成功します。

javascript

1# このように、icon配列から1番目を取得 2icon[0].addEventListener("click", function() { 3 fixed.classList.remove("fixed"); 4});

これで解決するとは思います。

別解

が、f-iconが一つしか存在しないのであれば、classではなくてidで指定した方がよさそうです。
そうすると、getElementByIdで要素取得できます。その結果、配列ではなくて一つの要素が取得でき、[0]でわざわざ1番目の要素を抜き出す必要がなくなります。

投稿2019/09/22 02:26

siruku6

総合スコア1382

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

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

Naoki_Pro

2019/09/22 04:35

丁寧に回答して頂きありがとうございます。大変分かりやすかったです。 icon[0].addEventListenerとしたら上手く稼働しました。 1つ気になったのが icon[0] を試しに icon[1] にしてみたら稼働しなくなりました。 これはどういった仕様になっているのでしょうか?
siruku6

2019/09/22 10:25 編集

理解の手助けができてよかったです。 [0]の意味についてですが、プログラミングにおける配列の考え方に慣れていないと分かりにくいかもしれません。 --- getElememtByClassNameメソッドを使うと、取得対象が複数存在するという前提で要素を探しに行きます。 今回、class名がf-iconになっている要素は1つしかありませんが、複数あった場合でもよいように、見つかった要素が配列に格納されます。 配列の最初の要素には、[0]でアクセス出来るので、今回は、[0]で1つ目のf-iconにアクセスできました。 [1]は2つ目、[2]だと3つ目というように、実際の数字からひとつズレた要素にアクセスする意味を持っているのですが、今回は1つしか要素がないため、[1]では空振りしてしまいます。 というわけで、[1]だと何も起こらない(おそらくエラーが発生している)という結果になってしまいます。 上手く伝われば幸いです。
Naoki_Pro

2019/09/22 10:23

分かりやすい説明ありがとうございます。 説明を読みながらエディタをいじってみたら理解できました。 丁寧でなおかつ分かりやすい説明だったのでベストアンサーにさせて頂きます。
guest

0

getElementsByClassNameで取得したものでiconを定義しているので、
取得したものは配列になります。そのため、icon[0].addEventListenerとしてあげる必要があります。

javascript

1icon[0].addEventListener("click", function() {

Document.getElementsByClassName()については、こちらで詳しく書かれています。

投稿2019/09/22 02:23

hatsu

総合スコア1809

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

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

Naoki_Pro

2019/09/22 10:26

今回は別の方をベストアンサーに選びましたが、回答して頂きありがとうございました。
guest

0

getElementsByClassNameは HTMLCollection を返すため使い方が違います。

【getElementsByClassNameとgetElementByIdの返り値の違い - Qiita】
https://qiita.com/rindarinda5/items/c26dc81fe8cd98992dc1

【Document.getElementsByClassName() - Web API | MDN】
https://developer.mozilla.org/ja/docs/Web/API/Document/getElementsByClassName

投稿2019/09/22 02:19

kei344

総合スコア69400

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

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

Naoki_Pro

2019/09/22 10:27

今回は別の方をベストアンサーに選びましたが、回答して頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問