3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【JavaScript】querySelectorAllとaddEventListener 併用できない??

Posted at

コード書く中でつまずいたので自分用メモ兼、私と同じようなJavaScript初学者のために記事書きました!

#結論

querySelectorAllでaddEventListenerは使えませんでした!

#過程
画像をクリックしたら要素を取得できるようにしたいと思い、
下記のコードを試してみましたが、思うようにいかない・・・

【html】

<div id="card1" class="cards"><img src="./images/gen1.png" alt=""></div>
<div id="card2" class="cards"><img src="./images/gen2.png" alt=""></div>
<div id="card3" class="cards"><img src="./images/gen3.png" alt=""></div>
<div id="card4" class="cards"><img src="./images/gen4.png" alt=""></div>


【JS】※正しくないコードです。

document.querySelectorAll('.cards').addEventListener('click',function(){
    console.log(this);
});

ググってみると下記サイトを発見し、そのサイトを元に原因究明してみました。
https://www.mitsue.co.jp/knowledge/blog/frontend/201805/24_0917.html
このサイトを1読して頂き、わからなければ当記事を参考にして頂ければ良いかと思います。(おこがましいですが・・)

##querySelectorAllで取得できる値はNodeListオブジェクトらしい・・
そして、NodeListオブジェクトはaddEventListenerを持たないらしい。
この情報を得て、
querySelectorAllの後にaddEventListenerをもってきても無駄だということが分かった。

qiita1.png

##HTMLエレメントではaddEventListenerが使えるらしい・・・

下記サイトのメソッドの部分を読むと、どうやらそうらしい。

forEachを使えばうまくいくらしい・・・

ググるとforEachは繰り返し処理で、for文の代わりに使えばサクッと繰り返し処理をかけるとのこと。
記事冒頭に紹介したサイト(https://www.mitsue.co.jp/knowledge/blog/frontend/201805/24_0917.html)
ではforEachを使用していた。
ここで繰り返し処理使う?と少し疑問に思いましたが、下記サイトのメソッドの部分にあるNodeList.forEach()の説明書きを見ると少し腑に落ちました。

イメージとしては、forEachによってNodeListオブジェクトがhtmlエレメントに変換され、 引数cardsに渡される。先に述べたように、htmlエレメントではaddEventListenerが使用できるので値が取得できるようになる。
document.querySelectorAll('.cards').forEach(function(cards){

    cards.addEventListener('click',function(){
        console.log(cards);

    });
});

下記の画像でも分かるようにコンソールにhtmlが表示されている。

qiita1.png

##改めて結論

querySelectorAllでaddEventListenerは使えませんでした。
代わりにforEachを使用し、それに関数を指定してください。
その関数の中にaddEventListenerを含む関数を使ってください。

htmlエレメントはaddEventListenerを持っている(使える)ため、
取得したNodeListオブジェクトをhtmlエレメントに変換するためにforEachを使うのだという結論に達しました。

文章力が低く、伝わらない部分があるかもしれませんが、誰かの役に立てれば幸いです。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?