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

[Quiz Effect] ํ€ด์ฆˆ ์ดํŽ™ํŠธ 03 - ์ฃผ๊ด€์‹(์—ฌ๋Ÿฌ ๋ฌธ์ œ) ์œ ํ˜•

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

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

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


์ฃผ๊ด€์‹(์—ฌ๋Ÿฌ ๋ฌธ์ œ) ์œ ํ˜•

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

// ์„ ํƒ์ž : ์ƒ์ˆ˜ const๋ฅผ ํ•„์š”ํ•œ ๋งŒํผ ์„ ์–ธํ•œ ๋‹ค์Œ HTML ์˜์—ญ์˜ div, ์‹œ๋งจํ‹ฑ ํƒœ๊ทธ ๋“ฑ์˜ Class๋ช…๊ณผ ์—ฐ๊ฒฐ์‹œํ‚จ๋‹ค.
// ๋ฌธ์ œ(<div class="quiz">)๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ด๋ฏ€๋กœ ๋’ค์— All์„ ๊ผญ! ๋ถ™์—ฌ์ฃผ๊ธฐ
const quizType = document.querySelectorAll(".quiz__type");                 // ํ€ด์ฆˆ ์ข…๋ฅ˜
const quizNumber = document.querySelectorAll(".quiz__question .number");   // ํ€ด์ฆˆ ๋ฒˆํ˜ธ
const quizAsk = document.querySelectorAll(".quiz__question .ask");         // ํ€ด์ฆˆ ์งˆ๋ฌธ
const quizConfirm = document.querySelectorAll(".quiz__answer .confirm");   // ์ •๋‹ต ํ™•์ธ ๋ฒ„ํŠผ
const quizResult = document.querySelectorAll(".quiz__answer .result");     // ์ •๋‹ต ๊ฒฐ๊ณผ
const quizInput = document.querySelectorAll(".quiz__answer .input");       // ์‚ฌ์šฉ์ž ์ •๋‹ต
const quizView = document.querySelectorAll(".quiz__view");             // ๊ฐ•์•„์ง€

// ๋ฌธ์ œ ์ •๋ณด
const quizInfo = [
    {
        answerType: "์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ 2016๋…„ 4ํšŒ",
        answerNum: "1",
        answerAsk: "๋จผ์ € ๋ณธ ์ƒ‰์˜ ์˜ํ–ฅ์œผ๋กœ ๋‚˜์ค‘์— ๋ณด๋Š” ์ƒ‰์ด ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด๋Š” ํ˜„์ƒ์€?",
        answerResult: "๊ณ„์‹œ๋Œ€๋น„"
    },
    {
        answerType: "์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ 2016๋…„ 4ํšŒ",
        answerNum: "2",
        answerAsk: "HTML ๋ฌธ์„œ์˜ ์‹œ์ž‘์„ ์•Œ๋ ค์ฃผ๋Š” ํƒœ๊ทธ๋Š”?",
        answerResult: "<html>"
    },
    {
        answerType: "์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ 2016๋…„ 4ํšŒ",
        answerNum: "3",
        answerAsk: "E-mail ์†ก์‹  ์‹œ์— ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํ† ์ฝœ์€?",
        answerResult: "SMTP"
    },
    {
        answerType: "์›น๋””์ž์ธ๊ธฐ๋Šฅ์‚ฌ 2016๋…„ 4ํšŒ",
        answerNum: "4",
        answerAsk: "์›น์‚ฌ์ดํŠธ ์ œ์ž‘ ๋‹จ๊ณ„ ์ค‘ ์‚ฌ์ดํŠธ์˜ ๋ชฉ์ ๊ณผ ์‚ฌ์šฉ์ž ๋ถ„์„์— ๋”ฐ๋ผ ์‚ฌ์ดํŠธ์˜ ๋””์ž์ธ ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•˜๋Š” ๋‹จ๊ณ„๋Š”?",
        answerResult: "์ฝ˜์…‰ํŠธ ๋„์ถœ"
    }
]

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


// ๋ฌธ์ œ ์ถœ๋ ฅ : ์›์‹œ์  ๋ฐฉ๋ฒ•
// textContent๊ฐ€ innerText๋ณด๋‹ค ์‚ฌ์šฉ๋นˆ๋„ ๋” ๋†’์Œ
// quizType[0].textContent = quizInfo[0].answerType;
// quizType[1].textContent = quizInfo[1].answerType;
// quizType[2].textContent = quizInfo[2].answerType;
// quizType[3].textContent = quizInfo[3].answerType;

// quizNumber[0].textContent = "0" + quizInfo[0].answerNum + ". ";
// quizNumber[1].textContent = "0" + quizInfo[1].answerNum + ". ";
// quizNumber[2].textContent = "0" + quizInfo[2].answerNum + ". ";
// quizNumber[3].textContent = "0" + quizInfo[3].answerNum + ". ";

// quizAsk[0].textContent = quizInfo[0].answerAsk;
// quizAsk[1].textContent = quizInfo[1].answerAsk;
// quizAsk[2].textContent = quizInfo[2].answerAsk;
// quizAsk[3].textContent = quizInfo[3].answerAsk;

// quizResult[0].textContent = quizInfo[0].answerResult;
// quizResult[1].textContent = quizInfo[1].answerResult;
// quizResult[2].textContent = quizInfo[2].answerResult;
// quizResult[3].textContent = quizInfo[3].answerResult;

// ๋ฌธ์ œ ์ถœ๋ ฅ : for๋ฌธ
// for(let i = 0; i < quizInfo.length; i++) {        // 4 ๋Œ€์‹  quizInfo.length๋ฅผ ์“ฐ๋ฉด ๋ฌธ์ œ๊ฐ€ ์ถ”๊ฐ€๋ผ๋„ ์ˆ˜์ •ํ•  ํ•„์š” X
//     quizType[i].textContent = quizInfo[i].answerType;
//     quizNumber[i].textContent = "0" + quizInfo[i].answerNum + ". ";
//     quizAsk[i].textContent = quizInfo[i].answerAsk;
//     quizResult[i].textContent = quizInfo[i].answerResult;
// }

// ๋ฌธ์ œ ์ถœ๋ ฅ : forEach๋ฌธ
// function ๊ด„ํ˜ธ ์•ˆ์— e๋ฅผ ๊ผญ ์จ์ค˜์•ผ ํ•จ. 
// e๋Š” ๋ฐ์ดํ„ฐ(element), i๋Š” ๋ฒˆํ˜ธ(index)
quizInfo.forEach((e, i) => {
    quizType[i].textContent = quizInfo[i].answerType;
    quizNumber[i].textContent = "0" + quizInfo[i].answerNum + ". ";
    quizAsk[i].textContent = quizInfo[i].answerAsk;
    quizResult[i].textContent = quizInfo[i].answerResult;
});

๋ฌธ์ œ ์ถœ๋ ฅ ๋ฐฉ๋ฒ•์€ ์›์‹œ์ ์ธ ๋ฐฉ๋ฒ•๊ณผ for๋ฌธ, forEach๋ฌธ, ์ด๋ ‡๊ฒŒ ์ด 3๊ฐ€์ง€์˜ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
forEach๋ฌธ์ด ๊ฐ€์žฅ ๊ฐ„๋žตํ™”๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ตœ์ข…์ ์œผ๋กœ๋Š” ์›์‹œ์  ๋ฐฉ๋ฒ•๊ณผ for๋ฌธ์„ ์ฃผ์„์ฒ˜๋ฆฌ ํ›„ forEach๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค.


// ์ •๋‹ต ์ˆจ๊ธฐ๊ธฐ : ์›์‹œ์  ๋ฐฉ๋ฒ•
// quizResult[0].style.display = "none";
// quizResult[1].style.display = "none";
// quizResult[2].style.display = "none";
// quizResult[3].style.display = "none";

// ์ •๋‹ต ์ˆจ๊ธฐ๊ธฐ : for๋ฌธ
// for(let i = 0; i < quizInfo.length; i++) {
//     quizResult[i].style.display = "none";
// }

// ์ •๋‹ต ์ˆจ๊ธฐ๊ธฐ : ์ฝ˜์†”์ฐฝ์œผ๋กœ ํ…Œ์ŠคํŠธ
// quizInfo.forEach((element) => {
//     console.log(element);
// });

// ์ •๋‹ต ์ˆจ๊ธฐ๊ธฐ : forEach
quizInfo.forEach((e, i) => {
    quizResult[i].style.display = "none";
});

๋ฌธ์ œ๋ฅผ ์ถœ๋ ฅํ–ˆ๋‹ค๋ฉด ์ผ๋‹จ ์ •๋‹ต ํ™•์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ธฐ ์ „๊นŒ์ง€ ๋ณด์ด๊ฒŒ ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
์ •๋‹ต ์ˆจ๊ธฐ๋Š” ๋ฐฉ๋ฒ•๋„ ์›์‹œ์  ๋ฐฉ๋ฒ•๊ณผ for๋ฌธ, forEach ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ ์ตœ์ข…์ ์œผ๋กœ๋Š” forEach๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


// ์ •๋‹ต ํ™•์ธ : forEach
// ์š”์†Œ btn์„ ๋งŒ๋“ค์–ด์„œ, ์„ ํƒ์ž quizConfirm ๊ณผ ์—ฐ๊ฒฐ์‹œํ‚ด
// ํŽ‘์…˜ ๊ด„ํ˜ธ ์•ˆ์˜ ์ˆœ์„œ๋Š” ๋ฐ˜๋“œ์‹œ (element, index, array)์ด๊ธฐ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ btn=element, num=index๊ฐ€ ๋จ.
quizConfirm.forEach((btn, num) => {
    btn.addEventListener("click", () => {       // ํด๋ฆญ ์‹œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œํ‚ค๊ธฐ
            
        // ์‚ฌ์šฉ์ž ์ •๋‹ต
        const userWord = quizInput[num].value; // ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋‹ต์„ userWord๋ผ๋Š” ์ƒ์ˆ˜์— ์ €์žฅ!

        // ์‚ฌ์šฉ์ž ์ •๋‹ต == ๋ฌธ์ œ ์ •๋‹ต (๋งž๋Š”์ง€ ํ™•์ธ)
        if(userWord == quizInfo[num].answerResult) {
            //์ •๋‹ต์ด๋ฉด
            // alert("์ •๋‹ต");   // alert ํ…Œ์ŠคํŠธ์šฉ, ํ…Œ์ŠคํŠธ ๋งˆ์นœ ํ›„ ์ฃผ์„์ฒ˜๋ฆฌ
            quizView[num].classList.add("like");    // ๊ฐ•์•„์ง€ ๋ฏธ์†Œ
            quizConfirm[num].style.display = "none";    // ์ •๋‹ตํ™•์ธ๋ฒ„ํŠผ ์ˆจ๊น€
            quizResult[num].style.display = "none";     // ์ •๋‹ต ์ˆจ๊ธฐ๊ธฐ
            quizInput[num].style.display = "block";     // ์ž…๋ ฅ์ฐฝ ๋‚จ๊ธฐ๊ธฐ
        } else {
            //์˜ค๋‹ต์ด๋ฉด
            // alert("์˜ค๋‹ต");
            quizView[num].classList.add("dislike");     // ๊ฐ•์•„์ง€ ์Šฌํ””
            quizConfirm[num].style.display = "none";    // ์ •๋‹ตํ™•์ธ๋ฒ„ํŠผ ์ˆจ๊น€
            quizResult[num].style.display = "block";    // ์ •๋‹ต ํ‘œ์‹œ
            quizInput[num].style.display = "none";      // ์ž…๋ ฅ์ฐฝ ์ˆจ๊น€
        }
    });
});

์ด์ œ ์ •๋‹ต ์ž…๋ ฅ ํ›„์˜ ๋™์ž‘์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ์‹์ด ๋ณต์žกํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ forEach๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒƒ.
addEventListener๋ฅผ ํ†ตํ•ด ํด๋ฆญ ์‹œ์˜ ์ด๋ฒคํŠธ๋ฅผ, if๋ฌธ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์™€ ๋ฌธ์ œ ์ •๋‹ต์„ ๋น„๊ตํ•˜๊ณ  ๊ทธ ๋‹ค์Œ ๋‚˜์™€์•ผ ํ•  ๋™์ž‘๋“ค์„ ์œ„์˜ ์˜ˆ์‹œ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋„๋ก ํ•œ๋‹ค.


๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


Reference Book

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