사이트 제작

정보처리 기능사 문제 사이트 만들기

진블로그 2023. 3. 14. 14:10
다른 명언

728x90
반응형

이미지를 클릭하면 사이트로 이동합니다.

저번 시간에는 주관식을 한문제만 확인하는 유형이었지만 오늘은 한 페이지에서 여러 문제의 주관식을 확인하는 유형의 사이트 입니다. 

 

html 코드입니다.

<!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>퀴즈 이펙트02</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:ebmdols@naver.com">ebmdols@naver.com</a>
    </footer>
    <!-- //footer -->
</body>
</html>

javascript 코드 입니다.

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



    // 문제 정보
    const quizInfo = [
        {
            infoType: "정보처리 기능사", 
            infoTime: "2011년 4회", 
            infoNumber: "1", 
            infoQuestion: "주파수분할 다중화 방식에서 각 채널간 간섭을 막기 위해서 일종의 완충지역 역할을 하는 것은?", 
            infoAnswer: "가드밴드", 
            infoDesc: "가드밴드(Guard Band) 주파수분할 다중화 방식에서 각 채널간 간섭을 막기 위해서 일종의 완충지역 역할을 한다."
        },{
            infoType: "정보처리 기능사", 
            infoTime: "2011년 4회", 
            infoNumber: "2", 
            infoQuestion: "사용자의 명령으로 시스템이 수행되고 그에 따른 결과를 나타내 주는 대화식 운영체제는 무엇인가?", 
            infoAnswer: "UNIX", 
            infoDesc: "UNIX는 사용자의 명령으로 시스템이 수행되고 그에 따른 결과를 나타내 주는 대화식 운영체제이다"
        },{
            infoType: "정보처리 기능사", 
            infoTime: "2011년 4회", 
            infoNumber: "3", 
            infoQuestion: "프로세스들이 서로 다른 프로세스가 차지하고 있는 자원을 무한정 기다려 시스템이 멈춘 것처럼 보이는 상태를 무엇이라 하는가", 
            infoAnswer: "교착상태", 
            infoDesc: "교착상태(Deadlock)는 2개 이상의 프로세스들이 서로 다른 프로세스가 차지하고 있는 자원을 무한정 기다려 시스템이 멈춘 것처럼 보이는 상태를 말한다."
        }
    ];

    // // 문제 출력
    //#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;

    // // 문제 번호
    // quizNumber[0].textContent = quizInfo[0].infoNumber;
    // quizNumber[1].textContent = quizInfo[1].infoNumber;
    // quizNumber[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;

    // quizNumber[0].textContent = quizInfo[0].infoNumber;
    // quizNumber[1].textContent = quizInfo[1].infoNumber;
    // quizNumber[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;
    //     quizNumber[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){            // index앞에 element가 있어야 index가 출력됨
        quizTitle[i].innerHTML = quizInfo[i].infoType + " " + quizInfo[i].infoTime;
        quizNumber[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
    // for(let i=0; i<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";
    });

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

선택자로 각 영역의 상수 이름을 선언하고 문제 정보를 배열안의 객체로 표현하여 총 3개로 나누었습니다.

querySelectorAll() 메서드를 사용하여 클래스가 quiz인 3개의 div태그를 한번에 묶어줄 수 있습니다. 

querySelectorAll() 메서드는 문서 내에서 주어진 CSS 선택자와 일치하는 모든 요소를 찾아서 NodeList 객체를 반환합니다.

quizTitle[0].textContent = quizInfo[0].infoType; 와 같이 계속 반복 작업하는 대신에 for와 forEach()문을 사용하여 코드를 훨씬 간편하게 만들 수 있습니다. 

 

    quizInfo.forEach(function(e, i){            // index앞에 element가 있어야 index가 출력됨
        quizTitle[i].innerHTML = quizInfo[i].infoType + " " + quizInfo[i].infoTime;
        quizNumber[i].textContent = quizInfo[i].infoNumber;
        quizQuestion[i].textContent = quizInfo[i].infoQuestion;
        quizAnswerResult[i].textContent = quizInfo[i].infoAnswer;
        quizDesc[i].textContent = quizInfo[i].infoDesc;
    });

 

innerText와 innerHTML은 둘 다 DOM 요소의 텍스트 콘텐츠를 가져오는 데 사용되는 속성입니다.

innerText는 HTML 태그를 제외하고 요소 내의 모든 텍스트 콘텐츠를 가져옵니다. 이를테면, <div>안녕하세요 <span>OpenAI</span></div> 이라는 코드가 있을 경우, div 요소의 innerText는 "안녕하세요 OpenAI"입니다.

반면 innerHTML은 요소 내부의 모든 콘텐츠, 즉 텍스트와 HTML 태그를 모두 가져옵니다. 위의 예시에서 div 요소의 innerHTML은 "안녕하세요 <span>OpenAI</span>"입니다.

innerText와 innerHTML은 요소 내의 텍스트를 가져오는 것 이외에도, 요소의 텍스트를 수정하거나 HTML 태그를 추가/삭제할 때도 사용됩니다. 그러나, innerHTML을 사용하여 요소 내의 HTML 태그를 수정하는 경우에는 보안 문제가 발생할 수 있으므로, 신중하게 사용해야 합니다.

 

textContent는 요소의 모든 자식 요소를 제외한 텍스트 콘텐츠만 가져옵니다. 즉, HTML 태그를 제외한 순수한 텍스트만을 가져옵니다.

 

728x90