04-01 Let's Practice Vocab
TOPIC: next ボタンの設定
CHECK
nextBtnEl
に Event Listener をつける
currentQuestionIndex++
で currentQuestionIndex
に 1 を足す
setNextQuestion()
で次の Question を表示する
- Enter キーをおしても次の問題に行けるようにする
document.addEventListener("keyup")
でキーボードが押されたかを確認する
e.key
が"Enter"ならつぎの問題に行く処理をする
hideResult()
関数を定義する
- result Element の class="hide"を追加し、消す
setNextQuestion()
の中にhideResult()
を呼び出す
const startBtnEl = document.getElementById("start-btn")
const questionAnswersContainerEl = document.getElementById(
"question-answers-container"
)
const headerContainerEl = document.getElementById("header-container")
const headerSmallEl = document.getElementById("header-small")
const nextBtnEl = document.getElementById("next-btn")
const answersEl = document.getElementById("answers")
const jpTextEl = document.getElementById("jp-text")
const enTextEl = document.getElementById("en-text")
const resultEl = document.getElementById("result-box")
const circleEl = document.getElementById("circle")
let shuffledQuestions
let currentQuestionIndex
startBtnEl.addEventListener("click", startGame)
nextBtnEl.addEventListener("click", () => {
currentQuestionIndex++
setNextQuestion()
})
document.addEventListener("keyup", (e) => {
if (e.key === "Enter") {
currentQuestionIndex++
setNextQuestion()
}
})
function startGame() {
startBtnEl.classList.add("hide")
shuffledQuestions = questions.sort(() => Math.random() - 0.5)
currentQuestionIndex = 0
questionAnswersContainerEl.classList.remove("hide")
headerContainerEl.style["display"] = "none"
headerSmallEl.classList.remove("hide")
setNextQuestion()
}
function setNextQuestion() {
resetState()
hideResult()
showQuestion(shuffledQuestions[currentQuestionIndex])
}
function resetState() {
nextBtnEl.classList.add("hide")
while (answersEl.children[0]) {
answersEl.removeChild(answersEl.children[0])
}
}
function showQuestion(question) {
jpTextEl.innerText = question.jp
enTextEl.innerText = question.en
question.answers.forEach((answer, idx) => {
const el = `
<div class="answer-box">
<div class="answer-number">
<span>${idx + 1}</span>
</div>
<h3 id="answer1" class="answer" data-number="1">${answer.text}</h3>
</div>
`
const div = document.createElement("div")
div.classList.add("answer-container")
div.innerHTML = el
if (answer.correct) {
div.children[0].dataset.correct = answer.correct
}
div.addEventListener("click", selectAnswer)
answersEl.appendChild(div)
})
}
function selectAnswer(e) {
const selectedAnswer = e.currentTarget.children[0]
const correct = selectedAnswer.dataset.correct
Array.from(answersEl.children).forEach((answerEl) => {
const answerBoxEl = answerEl.children[0]
setStatusClass(answerBoxEl, answerBoxEl.dataset.correct)
})
showResult(correct)
if (shuffledQuestions.length > currentQuestionIndex + 1) {
nextBtnEl.classList.remove("hide")
} else {
startBtnEl.innerText = "Restart"
startBtnEl.classList.remove("hide")
}
}
function setStatusClass(el, correct) {
clearStatusClass(el)
if (correct) {
el.classList.add("correct")
} else {
el.classList.add("wrong")
}
}
function clearStatusClass(el) {
el.classList.remove("correct")
el.classList.remove("wrong")
}
function showResult(correct) {
clearStatusClass(circleEl)
if (correct) {
circleEl.children[0].innerText = "You're Right!!"
} else {
circleEl.children[0].innerText = "You're Wrong..."
}
setStatusClass(circleEl, correct)
resultEl.classList.remove("hide")
}
function hideResult() {
resultEl.classList.add("hide")
}
const questions = [
{
target_num: 1,
jp: "現代の科学技術は私たちの生活を大いに[向上させた]。",
en: "Modern technology has greatly ( ) our lives.",
answers: [
{
text: "considered",
correct: false,
},
{
text: "improved",
correct: true,
},
{
text: "concerned",
correct: false,
},
{
text: "included",
correct: false,
},
],
},
{
target_num: 2,
jp: "生活の質はエネルギー使用に直接[関連し]てはいない。",
en: "The quality of life is not directly ( ) to energy use.",
answers: [
{
text: "produced",
correct: false,
},
{
text: "related",
correct: true,
},
{
text: "provided",
correct: false,
},
{
text: "improved",
correct: false,
},
],
},
{
target_num: 3,
jp: "言語はすべて私たちに社会に関する貴重な情報を[与える]ことができる。",
en: "All languages can ( ) us with valuable information about society.",
answers: [
{
text: "provide",
correct: true,
},
{
text: "include",
correct: false,
},
{
text: "relate",
correct: false,
},
{
text: "concern",
correct: false,
},
],
},
]