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

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

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

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

Q&A

解決済

1回答

3857閲覧

addEventListenerが動かない

kenji.jpc

総合スコア1

JavaScript

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

0グッド

0クリップ

投稿2020/09/03 12:29

プログラミング初心者です・・・

javascriptで数字をタッチするゲームを作ろうとしています。
startボタンを押すと数字がランダムに表示されるところまでは作りました。
その後、li要素で作った数字をクリックした後の機能を作ろうとしたのですが、
li.addEventListenerとしてもliがanyとなり取得できません。

調べたところ関数の中の変数は他の関数では呼び出すことができないというのを目にしました。
そこでPUSH()の中でliのクラスリストにbtnというのを追加し、btn.addEventListenerで動かそうとしても動かないです。

どなたかご教授お願い致します。

JavaScript

1'use strit' 2{ 3const start = document.getElementById('start'); 4const ul= document.querySelector('ul'); 5let PassCount = 0; 6let suji = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] 7const timer = document.getElementById('timer') 8 9 10 11function push(){ 12 for(i=0; i<16; i++){ 13 var li = document.createElement('li'); 14 ul.appendChild(li); 15 li.textContent = suji.splice(Math.floor(Math.random()*suji.length), 1)[0]; 16 li.classList.add('btn') 17 } 18 19} 20 21 22function timerStart(){ 23 PassCount = 0; 24 PassCountId = setInterval('showCount()',1000) ; 25 let correct = true; 26} 27 28function showCount(){ 29 PassCount++; 30 timer.textContent = `${PassCount}秒経過` 31} 32 33 34start.addEventListener('click',()=>{ 35 while (ul.firstChild) { 36 ul.removeChild(ul.firstChild); 37 } 38 timerStart(); 39 showCount(); 40 push(); 41}); 42 43 44 45const btn = document.getElementsByClassName('btn'); 46 47btn.addEventListener('click',(){ 48 49 50 51}); 52

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

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

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

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

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

guest

回答1

0

ベストアンサー

getElementsByClassNameは、
HTMLCollectionが取得されるため、
その変数に直接イベントを付与することはできません
要素を一個一個とりだして、それに対してイベントを付与する必要があります。

javascript

1const btn = document.getElementsByClassName('btn'); 2 3// HTMLCollectionを、配列として、全走査する 4[].forEach.call(btn, e => { 5 e.addEventListener('click', () => { 6 // 処理 7 }); 8});

投稿2020/09/03 13:17

miyabi_takatsuk

総合スコア9528

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

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

kenji.jpc

2020/09/06 07:23

丁寧な回答ありがとうございます。 要素一つ一つにイベントを設定する必要があるという事なのですね。 [].forEach.call(btn, e => { e.addEventListener('click', () => { このコードでもaddEventListenerがanyとなってしまうのですがどこを修正したらいいのでしょうか。 もしよろしければ、教えていただきたいです。
miyabi_takatsuk

2020/09/06 08:39

それは、 要素が入る前に実行しているからです。 push関数を実行して初めて、 .btn要素が生成されますが、 そのpush関数は、他要素のクリックで初めて実行される構文になっています。 ルートに書いた構文は、当然、関数の中身より先に実行されるため、 クリックで改めて生成させては後の祭りってことです。
kenji.jpc

2020/09/07 08:53

ありがとうございます。 つまり、クリックすることによってpush関数が作動するので、そのままでは生成されていないのでエラーになってしまうという解釈でよろしいでしょうか?
miyabi_takatsuk

2020/09/07 09:21

そうです。 ルートで書いた処理は、最初に全部実行される、 関数の中身は、関数を実行するまで中の処理は反映できない、 と覚えとくといいかと。
kenji.jpc

2020/09/08 05:11

なるほど、理解できました。 ありがとうございます。 では、この場合li要素に対してイベントを設定するためには、既存のli要素に対してイベントを設定すればよいのでしょうか? しかし、liをpush関数の中で定義しているため、他では使えないと思うのですが、この場合はpush関数の中身事変えてstartを押したときにliが生成されるようにした方がよいのでしょうか?
miyabi_takatsuk

2020/09/08 05:40

いくらでもやりようがありますが、 push関数のfor中で、ulにappendChildした後次行で、 li変数にイベント付与すればいいかと。 ただし、push関数が何度も実行するようなものであれば、工夫は必要です。 (addEventListenerは重複する)
kenji.jpc

2020/09/09 08:07

ありがとございます。 早速コードを書いていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問