๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Effect/Quiz Effect

[Quiz Effect] ํ€ด์ฆˆ ์ดํŽ™ํŠธ 04 - ๊ฐ๊ด€์‹(ํ•œ ๋ฌธ์ œ) ์œ ํ˜•

by ์ฝ”๋”ฉ๊ณต์ฑ… 2022. 8. 8.
๋ฐ˜์‘ํ˜•

ํ€ด์ฆˆ ๋งŒ๋“ค๊ธฐ 04

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ๊ทธ ๋™์•ˆ ๋ฐฐ์› ๋˜ JavaScript๋ฅผ ์ด์šฉํ•˜์—ฌ ํ€ด์ฆˆ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
์ด๋ฒˆ ํ•™์Šต ๋‚ด์šฉ์„ ์ž˜ ํ™œ์šฉํ•˜์—ฌ ์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ ์‹œํ—˜ ๊ณต๋ถ€ ์—ด์‹ฌํžˆ ํ•ด ๋ด…์‹œ๋‹ค!
๋ณ€์ˆ˜(let)์™€ ์ƒ์ˆ˜(const)์— ์ฟผ๋ฆฌ ์…€๋ ‰ํ„ฐ ๊ฐ’์„ ์ €์žฅ์‹œํ‚ค๊ณ , ๊ทธ ๋™์•ˆ ๋ฐฐ์šด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ ์ •๋ณด๋ฅผ HTML ํƒœ๊ทธ์— ์ถœ๋ ฅ์‹œํ‚ค๊ณ , ์ •๋‹ต์„ ์ˆจ๊ฒผ๋‹ค๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ํšจ๊ณผ๋“ค์„ ๊ตฌํ˜„์‹œ์ผœ๋ด…์‹œ๋‹ค!


๊ฐ๊ด€์‹ ์œ ํ˜•

๋„ค ๋ฒˆ์งธ ์ฃผ๊ด€์‹(์—ฌ๋Ÿฌ ๋ฌธ์ œ) ์œ ํ˜•์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์†Œ์Šค์™€ ๋ถ€์—ฐ ์„ค๋ช…(์ฃผ์„ ์ฒ˜๋ฆฌ๋จ)์ด๋‹ค.
HTML๊ณผ CSS ์†Œ์Šค๋ฅผ ํ•จ๊ป˜ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ๋งจ ์•„๋ž˜์˜ '์›๋ณธ ์†Œ์Šค ๋ณด๊ธฐ' ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๊ฒƒ.

// ์„ ํƒ์ž
// quizChoice์™€ quizSelect๋Š” ์ด 4๊ฐœ์ด๋ฏ€๋กœ ๋’ค์— All์„ ๋ถ™์—ฌ์ค€๋‹ค.
const quizType = document.querySelector(".quiz__type");                 // ํ€ด์ฆˆ ์ข…๋ฅ˜
const quizNumber = document.querySelector(".quiz__question .number");   // ํ€ด์ฆˆ ๋ฒˆํ˜ธ
const quizAsk = document.querySelector(".quiz__question .ask");         // ํ€ด์ฆˆ ์งˆ๋ฌธ
const quizConfirm = document.querySelector(".quiz__answer .confirm");   // ์ •๋‹ต ํ™•์ธ ๋ฒ„ํŠผ
const quizResult = document.querySelector(".quiz__answer .result");     // ์ •๋‹ต ๊ฒฐ๊ณผ
const quizView = document.querySelector(".quiz__view");                 // ๊ฐ•์•„์ง€
const quizSelects = document.querySelector(".quiz__selects");           // ๊ฐ๊ด€์‹ ๋ณด๊ธฐ
const quizChoice = quizSelects.querySelectorAll(".choice");             // ๊ฐ๊ด€์‹ ๋ณด๊ธฐ --> document ์•„๋‹Œ quizSelects ์จ์ฃผ๋ฉด ๋กœ๋”ฉ ์‹œ๊ฐ„ ์ ˆ์•ฝ๋จ
const quizSelect = quizSelects.querySelectorAll(".select");             // ๊ฐ๊ด€์‹ ๋ณด๊ธฐ

// ๋ฌธ์ œ ์ •๋ณด
// answerChoice๋Š” ๊ฐ์ฒด ์•ˆ์— ๋ฐฐ์—ด์ด ๋“ค์–ด๊ฐ„ ๊ตฌ์กฐ
const quizInfo = [
    {
        answerType: "์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ ํ•„๊ธฐ ๊ธฐ์ถœ๋ฌธ์ œ(2015.7.19) ์žฌ๊ตฌ์„ฑ ๋ชจ์˜๊ณ ์‚ฌ",
        answerNum: "1",
        answerAsk: "์ƒ‰์˜ 3์†์„ฑ ์ค‘ ์‚ฌ๋žŒ์˜ ๋ˆˆ์ด ๊ฐ€์žฅ ์˜ˆ๋ฏผํ•˜๊ณ  ๊ฐ•ํ•˜๊ฒŒ ๋ฐ˜์‘ํ•˜๋Š” ๋Œ€๋น„๋Š”?",
        answerChoice: ["๋ช…๋„๋Œ€๋น„", "์ƒ‰์ƒ๋Œ€๋น„", "๋ณด์ƒ‰๋Œ€๋น„", "์ฑ„๋„๋Œ€๋น„"],
        answerResult: "1",
        answerEx: "๋ช…๋„๋Œ€๋น„๊ฐ€ ์ƒ‰์˜ 3์†์„ฑ ์ค‘ ๊ฐ€์žฅ ์‚ฌ๋žŒ์˜ ๋ˆˆ์— ์˜ˆ๋ฏผํ•œ ์†์„ฑ์ด๋‹ค."
    }
]

์œ„์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ์ƒ์ˆ˜(const)๋ฅผ ํ•„์š”ํ•œ ๋งŒํผ ์ƒ์„ฑํ•œ ํ›„ HTML ์˜์—ญ์˜ div, ์‹œ๋งจํ‹ฑ ํƒœ๊ทธ ๋“ฑ์˜ class๋ช…๊ณผ ์—ฐ๊ฒฐ์‹œํ‚จ๋‹ค.
๋˜ํ•œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ฐ๊ด€์‹(4๊ฐœ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒ) ํ€ด์ฆˆ๋ฅผ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— answerChoice์— ๋˜ 4๊ฐœ์˜ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์ €์žฅ์‹œํ‚ฌ ํ•„์š”๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด์— ๋”ฐ๋ผ answerChoice๋Š” ๊ฐ์ฒด ์•ˆ์— ๋ฐฐ์—ด์ด ๋“ค์–ด๊ฐ„ ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค๋„๋ก ํ•œ๋‹ค.


// ๋ฌธ์ œยท๋ณด๊ธฐ์ถœ๋ ฅ - ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ๊ธฐ
// ๋ฌธ์ œ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์„œ๋กœ ์ถฉ๋Œ๋‚  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— function์„ ๋งŒ๋“ค์–ด์„œ ์•ˆ์— ์ง‘์–ด๋„ฃ์Œ
function updateQuiz() {
    // ๋ฌธ์ œ ์ถœ๋ ฅ (innerText ๋Œ€์‹  textContent๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋จ / ์ต์Šคํ”Œ๋กœ์–ด ํ˜ธํ™˜๋˜๋Š” ๊ฑด textContent)
    quizType.textContent = quizInfo[0].answerType;      // quizInfo๋Š” ๋ฐฐ์—ด ์† ๊ฐ์ฒด 1๊ฐœ ๋ฟ์ด๋ฏ€๋กœ [0]์ด๋‹ค.
    quizNumber.textContent = "0" + quizInfo[0].answerNum + ". ";
    quizAsk.textContent = quizInfo[0].answerAsk;
    quizResult.textContent = quizInfo[0].answerEx;

    // ๋ณด๊ธฐ ์ถœ๋ ฅ
    for(let i = 0; i < quizSelect.length; i++) {     // quizSelect = 4 --> ํด๋ž˜์Šค select๊ฐ€ ์ด 4๊ฐœ์ด๋ฏ€๋กœ
        quizChoice[i].textContent = quizInfo[0].answerChoice[i];    // quizChoice์™€ answerChoice๋Š” ์ด 4๋ฒˆ ๋ฐ˜๋ณต
    }

    // ํ•ด์„ค ์ˆจ๊ธฐ๊ธฐ
    quizResult.style.display = "none";
}
updateQuiz();       // ์ด๊ฑฐ ์จ์ค˜์•ผ ํ•จ์ˆ˜ ์‹คํ–‰๋จ

๋ฌธ์ œ ์ถœ๋ ฅ๊ณผ ๋ณด๊ธฐ ์ถœ๋ ฅ, ํ•ด์„ค ์ˆจ๊ธฐ๊ธฐ๋Š” updateQuiz() ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ์ฃผ๋„๋ก ํ•œ๋‹ค.
๋ฌธ์ œ๋ฅผ ๋งŽ์ด ๋งŒ๋“ค์ˆ˜๋ก ์„œ๋กœ ์ถฉ๋Œ์ด ๋‚  ์œ„ํ—˜์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์™€ ๊ฐ™์€ ์ž‘์—…์„ ํ•ด์ฃผ๋„๋ก ํ•œ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ updateQuiz();๋ฅผ ๊ผญ ์ ์–ด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์„ ์žŠ์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.


// ์ •๋‹ต ํ™•์ธ
function answerQuiz() {
    // ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์ •๋‹ต == ๋ฌธ์ œ ์ •๋‹ต (์ผ์น˜ ์—ฌ๋ถ€ ๊ฒ€์‚ฌ)
    // ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•œ input --> checked

    for(let i = 0; i < quizSelect.length; i++) {
        if(quizSelect[i].checked == true) {     // ๋ณด๊ธฐ์— ์ฒดํฌ๊ฐ€ ๋œ ์ƒํƒœ์ธ๊ฐ€ ํ™•์ธ
            // ์ฒดํฌ๋œ ๋ฒˆํ˜ธ์™€ ๋ฌธ์ œ ์ •๋‹ต ๋ฒˆํ˜ธ์™€ ์ผ์น˜ํ•˜๋Š”๊ฐ€
            if(quizSelect[i].value == quizInfo[0].answerResult) {
                // alert("์ •๋‹ต");   // alert ํ…Œ์ŠคํŠธ ๋งˆ์นœ ํ›„ ์ฃผ์„์ฒ˜๋ฆฌ
                quizView.classList.add("like");     // ๊ฐ•์•„์ง€ ๋ฏธ์†Œ
            } else {
                // alert("์˜ค๋‹ต");
                quizView.classList.add("dislike");      // ๊ฐ•์•„์ง€ ์Šฌํ””
                quizResult.style.display = "block";     // ์ •๋‹ต(ํ•ด์„ค) ํ‘œ์‹œ
                quizConfirm.style.display = "none";     // ์ •๋‹ต ํ™•์ธ ๋ฒ„ํŠผ ์ˆจ๊น€
            }
        } else {
            // alert("์ •๋‹ต์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.");      // 4๋ฒˆ ๋ฐ˜๋ณต๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์“ฐ์ง€ ์•Š์Œ
        }
    }
}

// ์ •๋‹ต ํด๋ฆญ ์‹œ ์ด๋ฒคํŠธ ์ถœ๋ ฅ
quizConfirm.addEventListener("click", answerQuiz);

์ •๋‹ต ํ™•์ธ์€ answerQuiz()๋ผ๋Š” ํ•จ์ˆ˜ ์•ˆ์— ๋„ฃ๋„๋ก ํ•œ๋‹ค.
๋จผ์ € for๋ฌธ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์ •๋‹ต๊ณผ ๋ฌธ์ œ ์ •๋‹ต์˜ ์ผ์น˜ ์—ฌ๋ถ€๋ฅผ 4๋ฒˆ ๊ฒ€์‚ฌํ•ด์•ผ ํ•œ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ, if๋ฌธ์„ ํ†ตํ•ด ๋ณด๊ธฐ์— ์ฒดํฌ๊ฐ€ ๋œ ์ƒํƒœ์ธ์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ณ ,
๊ทธ ๋‹ค์Œ์—๋Š” ์ค‘์ฒฉ if๋ฌธ์œผ๋กœ ๊ทธ ์ฒดํฌ๋œ ๋ฒˆํ˜ธ์™€ ๋ฌธ์ œ ์ •๋‹ต ๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ์ง€๋ฅผ ํ™•์ธํ•˜๋„๋ก ํ•œ๋‹ค.

๊ทธ ๋‹ค์Œ ์ •๋‹ต์ผ ๊ฒฝ์šฐ์˜ ๋ฐ˜์‘๊ณผ, ์˜ค๋‹ต์ผ ๊ฒฝ์šฐ์˜ ๋ฐ˜์‘์„ ์„ค์ •ํ•ด์ฃผ๋„๋ก ํ•œ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ๋Š” ์ •๋‹ต ํ™•์ธ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ์‹คํ–‰๋ฌธ์„ ์ ๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋ง์ž.


๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


Reference Book

JavaScript
HTML
CSS
๊ด‘๊ณ  ์ค€๋น„์ค‘์ž…๋‹ˆ๋‹ค.