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

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

Q&A

解決済

2回答

4899閲覧

alertが複数回出てしまう

sansu23

総合スコア1

JavaScript

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

0グッド

0クリップ

投稿2021/08/12 07:28

0

0

解決したいこと

周期表をクリックすると、選択肢が表示されるクイズ形式のサイトをつくろうと、プログラミングをしています。
しかし、選択肢をクリックすると、正解/不正解のアラートが表をクリックした回数分、複数回出てきてしまう問題をどう解決したらよいのか分かたず困っています。
プログラミング初心者であり、わかりにくいソースコードですが、よろしければ、解決に力を貸していただけると幸いです。なお、実際のソースコードは見にくいので、簡略化してあるソースコードを記載させていただきます。(問題は簡略化してあるものでも起こること、確認済み)

該当のソースコード

HTML

1<!DOCTYPE html> 2<html lang="jp"> 3<head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>Document</title> 8</head> 9<body> 10 <table border="1"> 11 <tr> 12 <th><button class="button">H</button></th> 13 <th><button class="button">He</button></th> 14 </tr> 15 <tr> 16 <th><button class="sentakusi">選択肢①</button></th> 17 <th><button class="sentakusi">選択肢②</button></th> 18 </tr> 19 </table> 20 21 <script src="sample.js"></script> 22</body> 23</html> 24``

JavaScript

1const genso = [ 2 "水素", 3 "ヘリウム", 4] 5 6const button = document.getElementsByClassName("button"); 7const sentaku = document.getElementsByClassName("sentakusi"); 8 9for (let i = 0; i < button.length; i++) { 10 button[i].addEventListener("click", () => { 11 var sentakuNo = Math.floor(Math.random() * sentaku.length) 12 sentaku[sentakuNo].textContent = genso[i]; 13 14 let gensoNo1 = Math.floor(Math.random() * genso.length); 15 16 while(i === gensoNo1){ 17 gensoNo1 = Math.floor(Math.random() * genso.length); 18 } 19 20 if(sentakuNo == 0){ 21 sentaku[1].textContent = genso[gensoNo1]; 22 }else{ 23 sentaku[0].textContent = genso[gensoNo1]; 24 } 25 26 27 for (let q = 0; q < 2; q++) { 28 sentaku[q].addEventListener("click", () => { 29 if(q === sentakuNo){ 30 window.alert("正解"); 31 }else{ 32 window.alert("不正解"); 33 } 34 })}; 35})};

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/08/12 07:34

> 正解/不正解のアラートが表をクリックした回数分、複数回出てきてしまう そのようにコーディングしてあるからではないのですか。そのように見えますけど。どうしたいのですか?
guest

回答2

0

ご回答ありがとうございました。

JavaScript

1const genso = [ 2 "水素", 3 "ヘリウム", 4] 5 6const button = document.getElementsByClassName("button"); 7const sentaku = document.getElementsByClassName("sentakusi"); 8var sentakuNo; 9 10for (let i = 0; i < button.length; i++) { 11 button[i].addEventListener("click", () => { 12 sentakuNo = Math.floor(Math.random() * sentaku.length) 13 sentaku[sentakuNo].textContent = genso[i]; 14 15 let gensoNo1 = Math.floor(Math.random() * genso.length); 16 17 while (i === gensoNo1) { 18 gensoNo1 = Math.floor(Math.random() * genso.length); 19 } 20 21 if (sentakuNo == 0) { 22 sentaku[1].textContent = genso[gensoNo1]; 23 } else { 24 sentaku[0].textContent = genso[gensoNo1]; 25 } 26 27 28 29 }) 30}; 31console.log(sentakuNo); 32for (let q = 0; q < 2; q++) { 33 sentaku[q].addEventListener("click", () => { 34 if (q === sentakuNo) { 35 window.alert("正解"); 36 } else { 37 window.alert("不正解"); 38 } 39 }) 40};

投稿2021/08/12 11:45

sansu23

総合スコア1

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

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

0

ベストアンサー

まずインデントを整理しましょう。コードフォーマッターの導入をオススメします。

イベントリスナーの内部でさらに addEventListener を行っています。
追加したリスナーを削除していないので呼び出された回数分どんどん増えますよね。

js

1(省略) 2 3for (let i = 0; i < button.length; i++) { 4 button[i].addEventListener("click", () => { 5 6 (省略) 7 8 for (let q = 0; q < 2; q++) { 9 sentaku[q].addEventListener("click", () => { 10 if (q === sentakuNo) { 11 window.alert("正解"); 12 } else { 13 window.alert("不正解"); 14 } 15 }) 16 }; 17 }) 18};

投稿2021/08/12 07:54

mather

総合スコア6765

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問