https://kuizy.net/quiz/10
現在上のサイトのような3択クイズを作っています。
htmlには何も書かず、jsで要素を作り、ループさせ選択肢や写真なども表示する形です。
ただ、シャッフルと、選択肢を押したときのイベント(色が変わり、正解!と表示される)、正誤判定(正解、不正解のときの)の書き方で困っています。
一つずつだと動作したりするのですが、全部動かそうとするとエラーが出てしまったりします。
かなり長い時間悩み、調べたのですが、自分では解決できなそうなので、答えのコードを教えていただき、そこから自分で考えたり、理解したいと考えております。
なので、分かる方がいましたら、正しいコードを書いていただきたいです。
一応、自分のコードを載せておきます。
私のコードとは全く関係なくても結構です。
html
1コード<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title> Quizy</title> 7 <link rel="stylesheet" href="./styles.css"> 8 9 <!-- bootstrap --> 10 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous"> 11</head> 12 13<body> 14 15 <script src="./main.js"></script> 16 <!-- bootstrap --> 17 <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> 18 <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script> 19 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous"></script> 20</body> 21</html>
css
1コード 2//リセットcss 3/* 4html5doctor.com Reset Stylesheet 5v1.6.1 6Last Updated: 2010-09-17 7Author: Richard Clark - http://richclarkdesign.com 8Twitter: @rich_clark 9*/ 10html, body, div, span, object, iframe, 11h1, h2, h3, h4, h5, h6, p, 12b, i,dl, dt, dd, ol, ul, li, 13time, mark, audio, video { 14 margin:0; 15 padding:0; 16 border:0; 17 outline:0; 18 vertical-align:baseline; 19 background:transparent; 20} 21body { 22 /* プロジェクトによって変動 */ 23 min-width: 1000px; 24 color: #000; 25 line-height: 1.6; 26 font-weight: 400; 27 font-family: 'ヒラギノ角ゴ ProN W3', 'Hiragino Kaku Gothic ProN', 'YuGothic', '游ゴシック', 'メイリオ', Meiryo, -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial, sans-serif; 28 width: 100%; 29 /* font-smoothing: antialiased; */ 30 font-variant-numeric: tabular-nums; 31 /* safari hover対策 */ 32 -webkit-font-smoothing: antialiased; 33} 34ul, ol { 35 list-style:none; 36} 37img { 38 vertical-align: bottom; 39 line-height: 1.0; 40} 41/* End of リセット css */ 42 43 44 45 46/* ここからcss */ 47.container{ 48 display: flex; 49 flex-direction: column; 50 align-items: center; 51 justify-content: center; 52} 53.box{ 54 width: 70%; 55 margin: 0 auto; 56 margin-top: 150px; 57} 58.box > p{ 59 font-size: 22px; 60 font-weight: bold; 61 background: linear-gradient(transparent 70%,#f7ff4e 0); 62 display: inline-block; 63} 64.btn{ 65 width: 70%; 66} 67.list{ 68 text-align: left; 69 border: 1px solid #ebebeb; 70 padding: 13px; 71 margin: 14px 0; 72 font-weight: 600; 73 cursor: pointer; 74 box-shadow: 0 3px 2px -2px rgba(0,0,0,.13); 75} 76.target{ 77 border: 1px solid #b3b0b0; 78 height: 100px; 79 padding: 13px; 80 margin: 30px 0; 81 font-weight: 600; 82 box-shadow: 0 3px 2px -2px rgba(0,0,0,.13); 83 display: flex; 84 flex-direction: column; 85 align-items: start; 86} 87.success{ 88 background: linear-gradient(transparent 70%,#0BB2EF 0); 89 display: inline-block; 90 91} 92.false{ 93 background: linear-gradient(transparent 70%,#FD6747 0); 94 display: inline-block; 95} 96/* javascript用 */ 97.color-blue{ 98 color: white; 99 background-color: #0BB2EF; 100} 101.color-red{ 102 color: white; 103 background-color: #FD6747; 104} 105.pointer-events{ 106 pointer-events: none ; 107 /* cursor: pointer; */ 108} 109.img-fluid{ 110 width: 100%; 111} 112
js
1コード 2 3 'use strict'; 4 { 5 // 配列 6 const quizeSet = ([ 7 ["たかなわ","こうわ","たかわ",1], 8 ["かめいど","かめど","かめと",1], 9 ["こうじまち","おかとまち","かゆまち",1], 10 ["ごせいもん","おなりもん","おかどもん",1], 11 ["とどろき","たたりき","たたら",1], 12 ["せきこうい","いじい","しゃくじい",1], 13 ["ざっしょく","ざっしき","ぞうしき",1], 14 ["みとちょう","おかちまち","ごしろちょう",1], 15 ["ろっこつ","ししぼね","しこね",1], 16 ["こぐれ","こばく","こしゃく",1], 17 ]); 18 19 //配列の中身をシャッフル 20 function shuffle(arr) { 21 for (let k = 3 - 1; k > 0; k--) { // k = ランダムに選ぶ終点のインデックス 22 const j = Math.floor(Math.random() * (k + 1)); // j = 範囲内から選ぶランダム変数 23 [arr[j], arr[k]] = [arr[k], arr[j]]; // 分割代入 k と j を入れ替える 24 } 25 return arr; 26 } 27 quizeSet.map(shuffle); 28 29 //ループ 30 for(let i = 0; i < quizeSet.length; i++){ 31 let h = '<div class="container" id="container">' 32 + '<div class="box" id="box">' 33 + '<p class="title" id="title">' 34 +`${i + 1}.この地名はなんて読む?` 35 +'</p>' 36 + `<img class="img-fluid" src="./img/${i}.png" alt="選択肢の写真">` //変数iを埋め込む 37 + '</div>' 38 + '<div class="btn" id="btn">' 39 + '<ul id="ul">'; 40 for(var g = 0; g < 3; g++){ 41 h += `<li class="list" id="${i}-${g}-1">${quizeSet[i][g]}</li>`; 42 let id = `document.getElementById("${i}-${g}-1")`; 43 }; 44 h += 45 '<div id="target">' 46 + '<p id="success"></p>' 47 + '<p id="successText"></p>' 48 + '</div>' 49 + '</ul>' 50 + '</div>' 51 + '</div>'; 52 document.write(h); 53 }; 54 55 56 //クリックしたときに表示させる文字用 57 // target 58 const target = document.getElementById("target"); 59 // success 60 const success = document.getElementById("success"); 61 // successText 62 const successText = document.getElementById("successText"); 63 const successNode1 = document.createTextNode('正解!'); 64 const successNode2 = document.createTextNode('正解は「たかなわ」です!'); 65 const falseNode1 = document.createTextNode('不正解!'); 66 const falseNode2 = document.createTextNode('正解は「たかなわ」です!'); 67