JAVASCRIPT

퀴즈 이펙트3 주관식(여러문제) 확인하기 유형

이미사용 2023. 3. 14. 14:12
명언
-
728x90
반응형

주관식 (여러문제) 확인하기 유형

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>퀴즈 이펙트03</title>

    <link rel="stylesheet" href="css/reset.css">
    <link rel="stylesheet" href="css/quiz.css">
</head>
<body >
    <header id="header">
        <h1><a href="../javascript14.html">Quiz</a> <em>주관식(여러문제) 확인하기 유형</em></h1>
        <ul>
            <li><a href="quizeffect01.html">1</a></li>
            <li><a href="quizeffect02.html">2</a></li>
            <li class="active"><a href="quizeffect03.html">3</a></li>
            <li><a href="quizeffect04.html">4</a></li>
        </ul>
    </header>
    <!-- //header -->

    <main id="main">
        <div class="quiz__wrap">
            <div class="quiz">
                <div class="quiz__header">
                    <h2 class="quiz__title"></h2>
                </div>
                <div class="quiz__main">
                    <div class="quiz__question">
                        <em></em>. <span></span>
                    </div>
                    <div class="quiz__view">
                        <div class="dog__wrap">
                            <div class="true">정답입니다!</div>
                            <div class="false">틀렸습니다!</div>
                            <div class="card-container">
                                <div class="dog">
                                    <div class="head">
                                        <div class="ears"></div>
                                        <div class="face"></div>
                                        <div class="eyes">
                                            <div class="teardrop"></div>
                                        </div>
                                        <div class="nose"></div>
                                        <div class="mouth">
                                            <div class="tongue"></div>
                                        </div>
                                        <div class="chin"></div>
                                    </div>
                                    <div class="body">
                                        <div class="tail"></div>
                                        <div class="legs"></div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="quiz__answer">
                        <input class="input" type="text" placeholder="정답을 적어주세요!">
                        <button class="confirm">정답 확인하기</button>
                        <div class="result"></div>
                    </div>
                    <div class="quiz__desc"></div>
                </div>
            </div>
            <div class="quiz">
                <div class="quiz__header">
                    <h2 class="quiz__title"></h2>
                </div>
                <div class="quiz__main">
                    <div class="quiz__question">
                        <em></em>. <span></span>
                    </div>
                    <div class="quiz__view">
                        <div class="dog__wrap">
                            <div class="true">정답입니다!</div>
                            <div class="false">틀렸습니다!</div>
                            <div class="card-container">
                                <div class="dog">
                                    <div class="head">
                                        <div class="ears"></div>
                                        <div class="face"></div>
                                        <div class="eyes">
                                            <div class="teardrop"></div>
                                        </div>
                                        <div class="nose"></div>
                                        <div class="mouth">
                                            <div class="tongue"></div>
                                        </div>
                                        <div class="chin"></div>
                                    </div>
                                    <div class="body">
                                        <div class="tail"></div>
                                        <div class="legs"></div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="quiz__answer">
                        <input class="input" type="text" placeholder="정답을 적어주세요!">
                        <button class="confirm">정답 확인하기</button>
                        <div class="result"></div>
                    </div>
                    <div class="quiz__desc"></div>
                </div>
            </div>
            <div class="quiz">
                <div class="quiz__header">
                    <h2 class="quiz__title"></h2>
                </div>
                <div class="quiz__main">
                    <div class="quiz__question">
                        <em></em>. <span></span>
                    </div>
                    <div class="quiz__view">
                        <div class="dog__wrap">
                            <div class="true">정답입니다!</div>
                            <div class="false">틀렸습니다!</div>
                            <div class="card-container">
                                <div class="dog">
                                    <div class="head">
                                        <div class="ears"></div>
                                        <div class="face"></div>
                                        <div class="eyes">
                                            <div class="teardrop"></div>
                                        </div>
                                        <div class="nose"></div>
                                        <div class="mouth">
                                            <div class="tongue"></div>
                                        </div>
                                        <div class="chin"></div>
                                    </div>
                                    <div class="body">
                                        <div class="tail"></div>
                                        <div class="legs"></div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="quiz__answer">
                        <input class="input" type="text" placeholder="정답을 적어주세요!">
                        <button class="confirm">정답 확인하기</button>
                        <div class="result"></div>
                    </div>
                    <div class="quiz__desc"></div>
                </div>
            </div>
        </div>
    </main>
    <!-- //main -->

    <footer id="footer">
        <a href="mailto:ghkddn132@naver.com">ghkddn132@naver.com</a>
    </footer>
    <!-- //footer -->
    <script>
        //선택자
        const quizWrap = document.querySelector(".quiz__wrap");
        const quizTitle = quizWrap.querySelectorAll(".quiz__title");                   //시험 종목 // 시험시간
        const quizQuestion = quizWrap.querySelectorAll(".quiz__question span");        //문제 번호
        const quizQuestionNum = quizWrap.querySelectorAll(".quiz__question em");       //문제 질문
        const quizAnswerConfirm = quizWrap.querySelectorAll(".quiz__answer .confirm"); //정답 버튼
        const quizAnswerResult = quizWrap.querySelectorAll(".quiz__answer .result");   //문제정답
        const quizDesc = quizWrap.querySelectorAll(".quiz__desc");                     //문제설명
        const quizAnswerInput = quizWrap.querySelectorAll(".quiz__answer .input");     //사용자 정답
        const dogWrap = quizWrap.querySelectorAll(".dog__wrap");

        //문제 정보
        const quizInfo = [
            {
                infoType: "정보처리 기능사",
                infoTime: "2015년 2회",
                infoNumber: "1",
                infoQuestion: "스프레드시트 작업에서 반복적으로 실행하는 경우에 한번의 명령을 자동화시켜 처리하는 기능은?",
                infoAnswer: "매크로",
                infoDesc: "매크로: 반복되는 단순 작업을 기록하였다가 자동으로 재생하는 기능"
            },
            {
                infoType: "정보처리 기능사",
                infoTime: "2015년 2회",
                infoNumber: "2",
                infoQuestion: "실행중인 프로그램이나 시스템을 중지시킬 수 있는 수행 중단기능(break on)을 설정할 수 있는 도스 파일은?",
                infoAnswer: "config.sys",
                infoDesc: "config.sys : 장치 및 기타 설정 파일"
            },
            {
                infoType: "정보처리 기능사",
                infoTime: "2015년 2회",
                infoNumber: "3",
                infoQuestion: "도스(MS-DOS)에서 1개의 하드디스크를 논리적으로 2개의 드라이브로 분할하고자 할 때 사용하는 명령어는?(소문자로)",
                infoAnswer: "fdisk",
                infoDesc: "하나의 물리적인 디스크를 논리적으로 2개 이상 분할하는 것을 파티션을 나눈다 라고 합니다, 따라서 FDISK 입니다."
            }
        ];

        //  문제 출력
        //#1//문제 종 
        // quizTitle[0].textContent = quizInfo[0].infoType;
        // quizTitle[1].textContent = quizInfo[1].infoType;
        // quizTitle[2].textContent = quizInfo[2].infoType;
        
        // //문제 시간
        // quizTime[0].textContent = quizInfo[0].infoTime;
        // quizTime[1].textContent = quizInfo[1].infoTime;
        // quizTime[2].textContent = quizInfo[2].infoTime;
        
        // //문제 번호
        // quizQuestionNum[0].textContent = quizInfo[0].infoNumber;
        // quizQuestionNum[1].textContent = quizInfo[1].infoNumber;
        // quizQuestionNum[2].textContent = quizInfo[2].infoNumber;

        // //문제 질문
        // quizQuestion[0].textContent = quizInfo[0].infoQuestion;
        // quizQuestion[1].textContent = quizInfo[1].infoQuestion;
        // quizQuestion[2].textContent = quizInfo[2].infoQuestion;

        // quizAnswerResult[0].textContent = quizInfo[0].infoAnswer;
        // quizAnswerResult[1].textContent = quizInfo[1].infoAnswer;
        // quizAnswerResult[2].textContent = quizInfo[2].infoAnswer;

        // quizDesc[0].textContent = quizInfo[0].infoDesc;
        // quizDesc[1].textContent = quizInfo[1].infoDesc;
        // quizDesc[2].textContent = quizInfo[2].infoDesc;

        //#2
        // 문제 종류 + 문제 시간
        // quizTitle[0].innerHTML = quizInfo[0].infoType + " " + quizInfo[0].infoTime;
        // quizTitle[1].innerHTML = quizInfo[1].infoType + " " + quizInfo[1].infoTime;
        // quizTitle[2].innerHTML = quizInfo[2].infoType + " " + quizInfo[2].infoTime;
        
        
        //문제 번호
        // quizQuestionNum[0].textContent = quizInfo[0].infoNumber;
        // quizQuestionNum[1].textContent = quizInfo[1].infoNumber;
        // quizQuestionNum[2].textContent = quizInfo[2].infoNumber;

        // //문제 질문
        // quizQuestion[0].textContent = quizInfo[0].infoQuestion;
        // quizQuestion[1].textContent = quizInfo[1].infoQuestion;
        // quizQuestion[2].textContent = quizInfo[2].infoQuestion;

        // for(let i=0; i<quizInfo.length; i++){
        //     quizTitle[i].innerHTML = quizInfo[i].infoType + " " + quizInfo[i].infoTime;
        //     quizQuestionNum[i].textContent = quizInfo[i].infoNumber;
        //     quizQuestion[i].textContent = quizInfo[i].infoQuestion;
        //     quizAnswerResult[i].textContent = quizInfo[i].infoAnswer;
        //     quizDesc[i].textContent = quizInfo[i].infoDesc;
        // }

        quizInfo.forEach(function(e, i){
            quizTitle[i].innerHTML = quizInfo[i].infoType + " " + quizInfo[i].infoTime;
            quizQuestionNum[i].textContent = quizInfo[i].infoNumber;
            quizQuestion[i].textContent = quizInfo[i].infoQuestion;
            quizAnswerResult[i].textContent = quizInfo[i].infoAnswer;
            quizDesc[i].textContent = quizInfo[i].infoDesc;
        });

        //정답 숨기기

        // quizAnswerResult[0].style.display ="none";
        // quizAnswerResult[1].style.display ="none";
        // quizAnswerResult[2].style.display ="none";
        // quizDesc[0].style.display = "none";
        // quizDesc[1].style.display = "none";
        // quizDesc[2].style.display = "none";
        
        // for(let i=0; quizInfo.length; i++){
        //     quizAnswerResult[i].style.display ="none";
        //     quizDesc[i].style.display = "none";
        // }
        
        quizInfo.forEach(function(e, i){
            quizAnswerResult[i].style.display ="none";
            quizDesc[i].style.display = "none";
        });

        //정답 확인
        quizAnswerConfirm.forEach(function(btn, num){
            btn.addEventListener("click", function(){

                //사용자 정답
                const userAnswer = quizAnswerInput[num].value;

                quizAnswerInput[num].style.display = "none";   //인풋박스 숨김
                quizAnswerResult[num].style.display ="block";  // 정답 보이기
                quizAnswerConfirm[num].style.display = "none"; // 정답 확인 버튼 숨기기
                quizDesc[num].style.display = "block";         //해설 보기
                
                //사용자 정답 == 문제 정답
                if(userAnswer == quizInfo[num].infoAnswer){
                    dogWrap[num].classList.add("like");
                } else {
                    dogWrap[num].classList.add("dislike");
                }

            });
        });


    </script>
</body>
</html>

 

우선 선택자를 만들어 줍니다. (변수 변수이름 = document.querySelector("지정위치")

 (변수 변수이름 = 특정변수가 실행 됐을때 같이 실행 하도록 하는 특정변수이름.querySelector("지정위치")

        //선택자
        const quizWrap = document.querySelector(".quiz__wrap");
        const quizTitle = quizWrap.querySelectorAll(".quiz__title");                   //시험 종목 // 시험시간
        const quizQuestion = quizWrap.querySelectorAll(".quiz__question span");        //문제 번호
        const quizQuestionNum = quizWrap.querySelectorAll(".quiz__question em");       //문제 질문
        const quizAnswerConfirm = quizWrap.querySelectorAll(".quiz__answer .confirm"); //정답 버튼
        const quizAnswerResult = quizWrap.querySelectorAll(".quiz__answer .result");   //문제정답
        const quizDesc = quizWrap.querySelectorAll(".quiz__desc");                     //문제설명
        const quizAnswerInput = quizWrap.querySelectorAll(".quiz__answer .input");     //사용자 정답
        const dogWrap = quizWrap.querySelectorAll(".dog__wrap");

 

문제 정보를 저장하여야 하는데 변수를 많이 저장해야 되므로 배열안에 객체를 사용하여 저장해 줍니다.

        const quizInfo = [
            {
                infoType: "정보처리 기능사",
                infoTime: "2015년 2회",
                infoNumber: "1",
                infoQuestion: "스프레드시트 작업에서 반복적으로 실행하는 경우에 한번의 명령을 자동화시켜 처리하는 기능은?",
                infoAnswer: "매크로",
                infoDesc: "매크로: 반복되는 단순 작업을 기록하였다가 자동으로 재생하는 기능"
            },
            {
                infoType: "정보처리 기능사",
                infoTime: "2015년 2회",
                infoNumber: "2",
                infoQuestion: "실행중인 프로그램이나 시스템을 중지시킬 수 있는 수행 중단기능(break on)을 설정할 수 있는 도스 파일은?",
                infoAnswer: "config.sys",
                infoDesc: "config.sys : 장치 및 기타 설정 파일"
            },
            {
                infoType: "정보처리 기능사",
                infoTime: "2015년 2회",
                infoNumber: "3",
                infoQuestion: "도스(MS-DOS)에서 1개의 하드디스크를 논리적으로 2개의 드라이브로 분할하고자 할 때 사용하는 명령어는?(소문자로)",
                infoAnswer: "fdisk",
                infoDesc: "하나의 물리적인 디스크를 논리적으로 2개 이상 분할하는 것을 파티션을 나눈다 라고 합니다, 따라서 FDISK 입니다."
            }
        ];

 

배열 안에 객체 문제 출력 하는법

전부 하나 하나 써주는 방법

        //  문제 출력
        //#1//문제 종 
        quizTitle[0].textContent = quizInfo[0].infoType;
        quizTitle[1].textContent = quizInfo[1].infoType;
        quizTitle[2].textContent = quizInfo[2].infoType;
        
        //문제 시간
        quizTime[0].textContent = quizInfo[0].infoTime;
        quizTime[1].textContent = quizInfo[1].infoTime;
        quizTime[2].textContent = quizInfo[2].infoTime;
        
        //문제 번호
        quizQuestionNum[0].textContent = quizInfo[0].infoNumber;
        quizQuestionNum[1].textContent = quizInfo[1].infoNumber;
        quizQuestionNum[2].textContent = quizInfo[2].infoNumber;

        //문제 질문
        quizQuestion[0].textContent = quizInfo[0].infoQuestion;
        quizQuestion[1].textContent = quizInfo[1].infoQuestion;
        quizQuestion[2].textContent = quizInfo[2].infoQuestion;

        quizAnswerResult[0].textContent = quizInfo[0].infoAnswer;
        quizAnswerResult[1].textContent = quizInfo[1].infoAnswer;
        quizAnswerResult[2].textContent = quizInfo[2].infoAnswer;

        quizDesc[0].textContent = quizInfo[0].infoDesc;
        quizDesc[1].textContent = quizInfo[1].infoDesc;
        quizDesc[2].textContent = quizInfo[2].infoDesc;

 

같은 선택자 끼리 묵는법

        // 문제 종류 + 문제 시간
        quizTitle[0].innerHTML = quizInfo[0].infoType + " " + quizInfo[0].infoTime;
        quizTitle[1].innerHTML = quizInfo[1].infoType + " " + quizInfo[1].infoTime;
        quizTitle[2].innerHTML = quizInfo[2].infoType + " " + quizInfo[2].infoTime;
        
        
        //문제 번호
        quizQuestionNum[0].textContent = quizInfo[0].infoNumber;
        quizQuestionNum[1].textContent = quizInfo[1].infoNumber;
        quizQuestionNum[2].textContent = quizInfo[2].infoNumber;

        //문제 질문
        quizQuestion[0].textContent = quizInfo[0].infoQuestion;
        quizQuestion[1].textContent = quizInfo[1].infoQuestion;
        quizQuestion[2].textContent = quizInfo[2].infoQuestion;

 

for문을 이용해 반복하는법

        for(let i=0; i<quizInfo.length; i++){
            quizTitle[i].innerHTML = quizInfo[i].infoType + " " + quizInfo[i].infoTime;
            quizQuestionNum[i].textContent = quizInfo[i].infoNumber;
            quizQuestion[i].textContent = quizInfo[i].infoQuestion;
            quizAnswerResult[i].textContent = quizInfo[i].infoAnswer;
            quizDesc[i].textContent = quizInfo[i].infoDesc;
        }

 

forEach()이용하여 반복하는법

        quizInfo.forEach(function(e, i){
            quizTitle[i].innerHTML = quizInfo[i].infoType + " " + quizInfo[i].infoTime;
            quizQuestionNum[i].textContent = quizInfo[i].infoNumber;
            quizQuestion[i].textContent = quizInfo[i].infoQuestion;
            quizAnswerResult[i].textContent = quizInfo[i].infoAnswer;
            quizDesc[i].textContent = quizInfo[i].infoDesc;
        });

이렇게 for과 forEach()를 이용하여 반복되는 것을 간략하게 적을 수 있습니다.


 

배열 안에 객체 정답 숨기는법

하나하나 써주는법

        quizAnswerResult[0].style.display ="none";
        quizAnswerResult[1].style.display ="none";
        quizAnswerResult[2].style.display ="none";
        quizDesc[0].style.display = "none";
        quizDesc[1].style.display = "none";
        quizDesc[2].style.display = "none";

 

for문을 이용해 반복하는법

        for(let i=0; quizInfo.length; i++){
            quizAnswerResult[i].style.display ="none";
            quizDesc[i].style.display = "none";
        }

 

forEach()를 이용해 반복하는법

        quizInfo.forEach(function(e, i){
            quizAnswerResult[i].style.display ="none";
            quizDesc[i].style.display = "none";
        });

 


 

forEach()를 이용해 정답 확인하기

        //정답 확인
        quizAnswerConfirm.forEach(function(btn, num){
            btn.addEventListener("click", function(){

                //사용자 정답
                const userAnswer = quizAnswerInput[num].value;

                quizAnswerInput[num].style.display = "none";   //인풋박스 숨김
                quizAnswerResult[num].style.display ="block";  // 정답 보이기
                quizAnswerConfirm[num].style.display = "none"; // 정답 확인 버튼 숨기기
                quizDesc[num].style.display = "block";         //해설 보기
                
                //사용자 정답 == 문제 정답
                if(userAnswer == quizInfo[num].infoAnswer){
                    dogWrap[num].classList.add("like");
                } else {
                    dogWrap[num].classList.add("dislike");
                }

            });
        });

 

 

※속성 정리

querySelectorAll DOM(Document Object Model)에서 사용되는 메서드 중 하나로, 특정 CSS 선택자에 해당하는 모든 요소를 가져오는 역할을 합니다.
innerHTML DOM(Document Object Model)에서 사용되는 속성 중 하나로, 해당 요소의 내부 HTML 콘텐츠를 가져오거나 설정하는 데 사용됩니다.

 

 

강아지 이미지 출처: 좋아요! 싫어요!가 분명한 강아지 애니메이션

https://wsss.tistory.com/913