본문 바로가기

Web Project

[제이쿼리] 배열과 라디오 버튼을 활용한 설문지

<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <title>우울증 자가 진단</title>
    <script src="js/jquery.min.js"></script>

    <script>
        var problem = 1; // 몇 번 문제인지를 설정하는 인덱스 변수
        var total = 0; // 점수를 저장하는 변수

        var test_check = null; // 문제가 모두 체크되었는지 확인하는 변수 (문제의 개수만큼 배열로 동적할당됨)
        var num_of_test = 20; // 문제의 총 개수를 저장하는 변수

        var all_problem_created = false; // 문제가 모두 만들어졌는지 여부를 확인하는 boolean 변수

        // 문자열 배열을 선언하여 각 문항들을 저장함
        // 첫 번째 데이터가 공백인 이유는 배열 인덱스 관리를 1부터 20까지 직관적으로 하기 위함
        var test_text = [
            [" "],
            ["1.평소에는 아무렇지도 않던 일들이 귀찮았다."],
            ["2.입맛도 없었고, 먹고 싶지도 않았다."],
            ["3.가족이나 친구가 도와줘도 우울한 기분이 나아지지 않았다."],
            ["4.나도 다른 사람들만큼 능력 있다고 느꼈다."],
            ["5.어떤 일을 하든 집중하기 힘들었다."],
            ["6.우울했다."],
            ["7.하는 일마다 힘들다고 느껴졌다."],
            ["8.앞일이 암담하게 느껴졌다."],
            ["9.내 인생은 실패작이라고 느꼈다."],
            ["10.두려웠다."],
            ["11.잠을 설쳤다, 잠이 안 왔다."],
            ["12.비교적 잘 지냈다."],
            ["13.평소보다 말을 적게 했다, 말수가 줄었다."],
            ["14.세상에 홀로 있는 것처럼 외로웠다."],
            ["15.사람들이 나를 차갑게 대하는 것 같았다."],
            ["16.생활에 큰 불만이 있었다."],
            ["17.갑자기 울음이 나왔다."],
            ["18.슬펐다."],
            ["19.사람들이 나를 싫어하는 것 같았다."],
            ["20.도무지 뭘 시작할 기운이 안 났다."]
        ];

        // 문제의 개수만큼 배열을 동적할당
        // 이 배열은 각 문제가 체크되었는지를 확인하는 용도
        function create_check_array() {
            test_check = new Array();

            for (var i = 1; i <= num_of_test + 1; i++) {
                test_check.push(false);
            }
        }

        function create_radio_button() {
            if (all_problem_created == false) { // 문제가 만들어져있지 않다면 -> 문제 생성
                create_check_array();
                all_problem_created = true;

                $("#radio_area").slideDown(); // 설문지를 펼침
                $("#end_btn").show(); // 종료 버튼을 표시함

                for (var i = 0; i < num_of_test; i++) { // 문제의 개수만큼 반복
                    var newText = document.createTextNode(test_text[problem]); // 질문 텍스트를 가져와서 저장함
                    document.getElementById("text_area").appendChild(newText); // 질문을 출력

                    for (var j = 0; j <= 3; j++) {
                        // 각 질문마다 라디오 버튼 생성 (0점 ~ 3점 총 4개)

                        var radioInput = document.createElement("input"); // <input>을 만들고 변수에 지정함

                        // 각 속성들을 지정함
                        radioInput.setAttribute("type", "radio"); // = radioInput.type = "radio";
                        radioInput.setAttribute("name", "problem" + problem);
                        radioInput.setAttribute("value", "answer" + j);

                        document.getElementById("btn_area").appendChild(radioInput); // 속성을 지정한 <input>을 출력 (라디오 버튼 출력)
                    }
                    problem++; // 각 문제의 출력이 끝나면 다음 문제로 넘어감

                    // 문제 출력이 끝나고 나면 줄바꿈
                    // 텍스트와 라디오 버튼에 각각 따로 지정해야 레이아웃 오류가 발생하지 않음
                    var hr1 = document.createElement("hr");
                    document.getElementById("text_area").appendChild(hr1);

                    var hr2 = document.createElement("hr");
                    document.getElementById("btn_area").appendChild(hr2);
                }
            }
            else { // 문제가 만들어져 있다면 -> 생성하지 않음
                alert("진행 중인 진단이 있습니다.");
            }
        }

        function check_gloomy() { // 총점 체크
            total = 0;

            for (var i = 1; i <= problem; i++) { // 문제의 개수만큼 반복
                var radio_btn = document.getElementsByName("problem" + i); // 문제의 개수만큼 라디오 버튼을 저장함

                for (var j = 0; j < radio_btn.length; j++) { // 저장된 라디오 버튼의 체크 여부 확인
                    if (radio_btn[j].checked) { // 버튼이 체크되었다면 해당 점수만큼을 총점에 더함
                        total += j;

                        // 배열에 표시
                        test_check[i] = true; // 해당 문제 체크 여부를 저장함
                    }
                }
            }

            if (all_problem_check() == true) { // test_check 배열을 통해 모든 문제가 체크되었는지 확인함
                alert("총점 : " + total); // 총점 표시

                // 각 점수의 구간에 따라 우울증의 정도를 출력
                if (total >= 0 && total <= 20) {
                    alert("정상적인 우울감.");
                }
                else if (total >= 21 && total <= 40) {
                    alert("주의가 필요한 우울감.");
                }
                else if (total >= 41 && total <= 60) {
                    alert("심각한 우울증.");
                }
            }
            else { // 체크되지 않은 문제가 있으면 오류 출력
                alert("확인하지 않은 문항이 있습니다.");
            }
        }

        // test_check 배열을 통해 모든 문제가 체크되었는지 확인함
        function all_problem_check() {
            for (var i = 1; i < num_of_test + 1; i++) {
                if (test_check[i] == false) {
                    return false;
                }
            }
            return true;
        }
    </script>
    <style>
        #radio_area {
            width: 600px;
            height: 820px;
            background-color: lightgray;
            padding: 10px;

            display: none;
        }

        #text_area {
            width: 80%;
            float: left;
            display: block;
        }

        #btn_area {
            width: 20%;
            float: right;
            text-align: right;
            display: block;
        }

        .display_score {
            float: right;
            font-size: 0.7em;
            font-style: italic;
            text-align: right;
        }

        #end_btn {
            display: none;
        }
    </style>
</head>

<body>
    <h2>우울증 자가 진단</h2>
    <button id="start_btn" onclick="create_radio_button()">진단 시작</button>
    <br><br>
    <div id="radio_area">
        <div class="display_score">
            * 답변 방법<br>
            전혀 아니다(0) / 아니다(1) / 그렇다(2) / 매우 그렇다(3)
        </div>
        <br><br>
        <div id="text_area"></div> <!-- 문제 출력 div -->
        <div id="btn_area"></div> <!-- 라디오 버튼 출력 div -->
    </div>
    <br>
    <button id="end_btn" onclick="check_gloomy()">결과 보기</button>
</body>
</html>