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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

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

Q&A

解決済

1回答

1531閲覧

JS:score計算、radio/buttonイベント、コード短縮

mo__fumi

総合スコア13

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

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

0グッド

0クリップ

投稿2018/07/27 10:03

編集2018/07/28 14:46

JS練習のため簡易クイズアプリを製作しています。
クイズが3問あり、各設問にはradioボタン、”回答する”ボタンがあります。
また最後には”スコアを見る”ボタンがあり合計スコアが表示されると同時に、console.logでコメントが表示されます。

問題点は以下の三つです(他にもありそうですが・・・)

(1)score1, score2, score3を足す計算が上手くいかない。
score1+score2+score3だと例えば1点+1点+0点=2点となる場合もあるが全ての場合において答えが0で計算されてしまう。

(2)radioボタン選択時とbuttonクリック時、各々でconsole.logでコメントを出したいが上手く両立されない(現在はradioボタン選択時のみ正常に動いています)。
"回答する"ボタンを押すと console.log('不正解です。', '現在のトータルスコア:' + score) となるようにしたいが script.js:37 Uncaught ReferenceError: value1 is not defined at answerQuiz1 (script.js:37) at HTMLButtonElement.onclick (index.html:21) といったエラーが出る。

(3)もう少しまとめて短いコードにできる気がするがやり方がわからない。例えば、

JS

1function quiz1() { 2 function selectQuiz1() { 3 ... 4 } 5 function answerQuiz1() { 6 ... 7 } 8}

のように書いて見たがエラーになった。
コードは以下です。

js

1 let score = 0; 2 let score1 = 0; 3 let score2 = 0; 4 let score3 = 0; 5 score = score1 + score2 + score3; //この式が機能していない? 6 7 8 function selectQuiz1() { 9 const quiz_1 = document.getElementById('quiz-1'); 10 const value1 = quiz_1.answer.value; 11 12 switch (value1) { 13 case 'a': 14 console.log('1問目の' + value1 + 'を選択しました') 15 break; 16 case 'b': 17 console.log('1問目の' + value1 + 'を選択しました') 18 break; 19 case 'c': 20 console.log('1問目の' + value1 + 'を選択しました') 21 break; 22 } 23 } 24 25 function answerQuiz1() { 26 switch (value1) { 27 case 'a': 28 score1 = 0; 29 console.log('不正解です。', '現在のトータルスコア:' + score) 30 break; 31 case 'b': 32 score1 = 1; 33 console.log('正解です。', '現在のトータルスコア:' + score) 34 break; 35 case 'c': 36 score1 = 0; 37 console.log('不正解です。', '現在のトータルスコア:' + score) 38 break; 39 } 40 } 41 42 function selectQuiz2() { 43 const quiz_2 = document.getElementById('quiz-2'); 44 const value2 = quiz_2.answer.value; 45 46 switch (value2) { 47 case 'a': 48 console.log('2問目の' + value2 + 'を選択しました') 49 break; 50 case 'b': 51 console.log('2問目の' + value2 + 'を選択しました') 52 break; 53 case 'c': 54 console.log('2問目の' + value2 + 'を選択しました') 55 break; 56 } 57 } 58 59 function answerQuiz2() { 60 switch (value2) { 61 case 'a': 62 score2 = 1; 63 console.log('正解です。', '現在のトータルスコア:' + score) 64 break; 65 case 'b': 66 score2 = 0; 67 console.log('不正解です。', '現在のトータルスコア:' + score) 68 break; 69 case 'c': 70 score2 = 0; 71 console.log('不正解です。', '現在のトータルスコア:' + score) 72 break; 73 } 74 } 75 76 function selectQuiz3() { 77 const quiz_3 = document.getElementById('quiz-3'); 78 const value3 = quiz_3.answer.value; 79 80 switch (value3) { 81 case 'a': 82 console.log('3問目の' + value3 + 'を選択しました') 83 break; 84 case 'b': 85 console.log('3問目の' + value3 + 'を選択しました') 86 break; 87 case 'c': 88 console.log('3問目の' + value3 + 'を選択しました') 89 break; 90 } 91 } 92 93 function answerQuiz3() { 94 switch (value3) { 95 case 'a': 96 score3 = 0; 97 console.log('不正解です。', '現在のトータルスコア:' + score) 98 break; 99 case 'b': 100 score3 = 0; 101 console.log('不正解です。', '現在のトータルスコア:' + score) 102 break; 103 case 'c': 104 score3 = 1; 105 console.log('正解です。', '現在のトータルスコア:' + score) 106 break; 107 } 108 } 109 110 function showScore() { 111 document.getElementById('score-message').innerHTML = score; 112 113 if (score === 3) { 114 console.log('3点:すばらしい!'); 115 } else if (score === 2) { 116 console.log('2点;おしい!'); 117 } else if (score === 1) { 118 console.log('1点;まあまあ'); 119 } else { 120 console.log('0点;残念'); 121 } 122 }

html

1<!DOCTYPE html> 2<html> 3<head> 4<link rel="stylesheet" href="styles.css" /> 5<script src="script.js"></script> 6</head> 7<body> 8<div class="quizzes-container"> 9<h1>Quiz</h1> 10 <div class="quiz-container"> 11 <h2>1問目</h2> 12 <div> 13 <p>モロッコの首都は次のうちのどれ</p> 14 </div> 15 <form id="quiz-1" onclick="selectQuiz1();"> 16 <input name="answer" type="radio" value="a">カサブランカ</input> 17 <!--正解はBのラバト----> 18 <input name="answer" type="radio" value="b">ラバト</input> 19 <input name="answer" type="radio" value="c">マラケシュ</input> 20 </form> 21 <button class="btn" type="button" onclick="answerQuiz1();">回答する</button> 22 </div> 23 <div class="quiz-container"> 24 <h2>2問目</h2> 25 <div> 26 <p>世界でもっとも深い湖は次のうちのどれ</p> 27 </div> 28 <form id="quiz-2" onclick="selectQuiz2();"> 29 <!--正解はAのバイカル湖----> 30 <input name="answer" type="radio" value="a">バイカル湖</input> 31 <input name="answer" type="radio" value="b">カスピ海</input> 32 <input name="answer" type="radio" value="c">ビクトリア湖</input> 33 </form> 34 <button class="btn" type="button" onclick="answerQuiz2();">回答する</button> 35 </div> 36 <div class="quiz-container"> 37 <h2>1問目</h2> 38 <div> 39 <p>絵画「夜警」を描いた画家は次のうちのどれ</p> 40 </div> 41 <form id="quiz-3" onclick="selectQuiz3();"> 42 <input name="answer" type="radio" value="a">フェルメール</input> 43 <input name="answer" type="radio" value="b">カラバッジオ</input> 44 <!--正解はCのレンブラント----> 45 <input name="answer" type="radio" value="c">レンブラント</input> 46 </form> 47 <button class="btn" type="button" onclick="answerQuiz3();">回答する</button> 48</div> 49<div id="score-container"> 50 <button class="btn" type="button" onclick="showScore();">スコアを見る</button> 51 <!--pタグ内にスコアを表示--> 52 <p id="score-message"></p> 53</div> 54</body>

css

1.quizzes-container{ 2 width: 400px; 3} 4 5.quiz-container{ 6 border-bottom:1px solid black; 7 padding-bottom: 20px; 8} 9 10 11#score-container{ 12 border: 1px solid black; 13}

どなたかアドバイス頂けたら幸いです。よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2018/07/27 11:28

「うまく動作しない」「うまくいかない」では何が起きているか伝わりません。「○○のようになるはずなのに××となってしまう」のような形で「ゴール」と「現象(エラーメッセージなども含む)」を明確にしてください。https://teratail.com/help/question-tips#questionTips3-4-1
mo__fumi

2018/07/28 08:23

コメントありがとうございます! (1)socre1+score2+score3だと例えば1点+1点+0点=2点となる場合もあるが全ての場合において答えが0で計算されてしまう。 (2)"回答する"ボタンを押すと console.log('不正解です。', '現在のトータルスコア:' + score) となるようにしたいが script.js:37 Uncaught ReferenceError: value1 is not defined at answerQuiz1 (script.js:37) at HTMLButtonElement.onclick (index.html:21) といったエラーが出る。という状況です。慣れておらずすみません今後気をつけます!
m.ts10806

2018/07/28 12:13

質問は編集できるので適宜追記してください。ここのコメント欄はデフォルト非表示のため、目につきにくいです。
mo__fumi

2018/07/28 14:47

おお!!機能についても勉強になりました^^;ありがとうございました!!
guest

回答1

0

ベストアンサー

ざっと見てみてみましたが、selectQuiz1()などで値を取り出すのは、
document.getElementById('quiz-1').elements["answer"].value
のようにする必要がありそうです。

値を取り出す例だと https://developer.mozilla.org/ja/docs/Web/API/HTMLFormElement ですね。

また、selectQuiz1()などについてはそもそも使わなくても良くて、answerQuiz1()などを呼び出す時に値を取ってくればよいかと思います。

そしてanswerQuiz1()などの方ですが、正解を別のオブジェクトに入れておいて、answerQuiz(quizId)といったようにformのIDを指定するようにすれば、3つではなく1つにまとめられます。個別のscoreについてもグローバルなオブジェクトに入れておく感じですね。

というわけで、ざっくり直すとこんな感じでしょうか。

js

1const correctAnswers = {"quiz-1":"b", "quiz-2":"a", "quiz-3": "c"}; 2let scores = {"quiz-1":0, "quiz-2":0, "quiz-3":0}; 3 4function answerQuiz(quizId) { 5 const value1 = document.getElementById(quizId).elements["answer"].value; 6 const correctAnswer = correctAnswers[quizId]; 7 if (value1 === correctAnswer) { 8 scores[quizId] = 1; 9 console.log('正解です。', '現在のトータルスコア:' + calcScore()) 10 } else { 11 scores[quizId] = 0; 12 console.log('不正解です。', '現在のトータルスコア:' + calcScore()) 13 } 14} 15 16function calcScore() { 17 return scores["quiz-1"] + scores["quiz-2"] + scores["quiz-3"]; 18} 19 20function showScore() { 21 const score = calcScore(); 22 document.getElementById('score-message').innerHTML = score; 23 24 if (score === 3) { 25 console.log('3点:すばらしい!'); 26 } else if (score === 2) { 27 console.log('2点;おしい!'); 28 } else if (score === 1) { 29 console.log('1点;まあまあ'); 30 } else { 31 console.log('0点;残念'); 32 } 33}

点数の計算にはcalcScore()という関数を追加しています。
HTMLも以下のように直しておいてください。

html

1<!DOCTYPE html> 2<html> 3<head> 4<link rel="stylesheet" href="styles.css" /> 5<script src="script.js"></script> 6</head> 7<body> 8<div class="quizzes-container"> 9<h1>Quiz</h1> 10 <div class="quiz-container"> 11 <h2>1問目</h2> 12 <div> 13 <p>モロッコの首都は次のうちのどれ</p> 14 </div> 15 <form id="quiz-1"> 16 <input name="answer" type="radio" value="a">カサブランカ</input> 17 <!--正解はBのラバト----> 18 <input name="answer" type="radio" value="b">ラバト</input> 19 <input name="answer" type="radio" value="c">マラケシュ</input> 20 </form> 21 <button class="btn" type="button" onclick="answerQuiz('quiz-1');">回答する</button> 22 </div> 23 <div class="quiz-container"> 24 <h2>2問目</h2> 25 <div> 26 <p>世界でもっとも深い湖は次のうちのどれ</p> 27 </div> 28 <form id="quiz-2"> 29 <!--正解はAのバイカル湖----> 30 <input name="answer" type="radio" value="a">バイカル湖</input> 31 <input name="answer" type="radio" value="b">カスピ海</input> 32 <input name="answer" type="radio" value="c">ビクトリア湖</input> 33 </form> 34 <button class="btn" type="button" onclick="answerQuiz('quiz-2');">回答する</button> 35 </div> 36 <div class="quiz-container"> 37 <h2>1問目</h2> 38 <div> 39 <p>絵画「夜警」を描いた画家は次のうちのどれ</p> 40 </div> 41 <form id="quiz-3"> 42 <input name="answer" type="radio" value="a">フェルメール</input> 43 <input name="answer" type="radio" value="b">カラバッジオ</input> 44 <!--正解はCのレンブラント----> 45 <input name="answer" type="radio" value="c">レンブラント</input> 46 </form> 47 <button class="btn" type="button" onclick="answerQuiz('quiz-3');">回答する</button> 48</div> 49<div id="score-container"> 50 <button class="btn" type="button" onclick="showScore();">スコアを見る</button> 51 <!--pタグ内にスコアを表示--> 52 <p id="score-message"></p> 53</div> 54</body>

投稿2018/07/28 04:33

takahashim

総合スコア1877

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

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

mo__fumi

2018/07/28 09:59

丁寧に書いてくださって心から感謝です・・・!!!ちょっと理解に時間がかかる脳みそなので一つずつじっくり読んでいます・・・正解を別のオブジェクトに入れるなど目から鱗でした。そしてこんなにJSが短くなるなんて感動です!全て理解してからお返事しようと思ったのですが時間かかりそうなのでお先にお礼だけお伝えしたく・・・もし質問あればまたコメントさせてください;ひとまずは、ありがとうございました!!
mo__fumi

2018/07/28 10:32

answerQuiz(quizId) の quizIdとは、例えば <form id="quiz-1" onclick="selectQuiz1();"> の id="quiz-1" のことでしょうか?
takahashim

2018/07/28 12:29

それですね。修正したHTMLの方の、 <button class="btn" type="button" onclick="answerQuiz('quiz-1');"> の'quiz-1'がanswerQuiz()関数に渡されて、それがdocument.getElementById(quizId)やcorrectAnswers[quizId]などで使われる、という流れです。
mo__fumi

2018/07/28 12:39

なるほど。ここで quizId = "quiz-1", "quiz-2", "quiz-3" のように書かなくてもquizIdが何を指しているかわかるのは、htmlで onclick="answerQuiz('quiz-1') のように()に quiz-1, quiz-2, quiz-3 がそれぞれ入っており、function answerQuiz(quizId) ここで()の中に quizId を代入?したためということでしょうか?
takahashim

2018/07/28 13:14

はい、そうやって引数として渡しているからです。
mo__fumi

2018/07/28 13:18

わかりました!!ありがとうございます^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問