상세 컨텐츠

본문 제목

javascript 동적생성, 입력폼 input 박스 등등 동적으로 생성/삭제하기.. 설문조사 항목생성 실전코드

IT공부방/jQuery, ajax, java

by 동해둘리 2023. 8. 14. 14:02

본문

반응형

javascript 동적생성, 입력폼 input 박스

 

아래와 같이 설문조사를 위한 등록화면에서, 설문조사 항목을 동적으로 생성하는 프로젝트를 진행하게 되어 작업내역을 공개하려고 합니다. 

 

javascript 동적생성

 

 

 

설문조사 항목 동적생성

 

위 화면에서 '선택형' 또는 '입력형' 을 선택한 후에 + 버튼을 클릭하면, 아래와 같이 설문조사 항목을 입력할 수 있는 입력폼이 동적으로 생성되게 됩니다. 

 

 

javascript 동적생성

 

각 질문은 삭제가 가능하며, 선택가능한 항목도 추가 삭제가 가능하게 만들어 봤습니다. 각 선택항목은 위/아래 화살표를 이용하여 위치이동이 가능하도록 만들어 봤습니다. 

 

 

 

 

 

먼저, 설문조사 항목이 동적으로 추가될 div 를 생성합니다. 

1
<div id = "question_box"></div>
cs

설문조사 동적생성 설문항목 동적생성

그런후에 '선택형' 또는 '입력형'을 선택하고 + 버튼을 클릭하면 앞서 정의한 DIV인 question_box 내에 설문항목이 동적으로 추가됩니다. 

 

 

 

 

 

 

아래의 AddQuestion() 함수가 + 버튼을 클릭시 실행되는 함수이며, '선택형'과 '입력형'에 따라 각각의 입력폼을 정의하여 동적으로 question_box에 추가하는 코드입니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
var gQuestionNum  = 0;                                
 
function AddQuestion()
{
    gItemNum = 0;
 
    if ( gQuestionType == "" ) {
        alert("질문 타입을 선택하세요"); return false;
    }
 
    // 설문조사 DIV를 읽어온다
    question_box = document.getElementById("question_box");
 
    // 질문 개수를 증가한다 
    gQuestionNum += 1;
 
    // P 엘리먼트를 만들고 question1, question2 ~~ questionN 과 같이 
    // ID를 부여하여, 삭제시 ID를 이용하여 삭제한다 
    const newP = document.createElement('p');
    newP.id = "question" + gQuestionNum;
    
    var sQuestion = "";
 
    if ( gQuestionType == "선택형" )
    {
        // 동적으로 생성할 입력폼을 정의한다
        // AddItem() 함수는 질문의 선택옵션 항목을 추가하기 위해 포함시켰습니다 
        sQuestion = "<table style='width:850px;margin-top:25px;'>" +
            "<tr>" +
                "<td style='width:50px;vertical-align: top;font-size:19px;font-weight:600;'>" +
                    "<div style='margin-top:5px;'>Q</div>" +
                "</td>" +
                "<td style='width:1150px'>" +
                    "<input type = 'hidden' name = 'question" + gQuestionNum + "_type' value = '선택형'>" +
                    "<input type = 'text' id = 'question" + gQuestionNum + "' name = 'question" + gQuestionNum + "' style='width:550px;margin-bottom:5px;float:left;margin-right:30px;' placeholder='질문'>                                    " +
                    "<div onclick = 'RemoveQuestion(" + gQuestionNum + ")' class='arrow-button' style='margin-top:1px' >X</div>" +
                    "<div id = 'item" + gQuestionNum + "'>" +
                        "<div id = 'item_list" + gQuestionNum + "'>" +
                        "</div>" +                                                    
                    "</div>" +                                                
                "</td>" +
            "</tr>" +                                        
            "<tr><td></td><td>" +
            "<div onclick = 'javascript:AddItem(" + gQuestionNum + ")' class='arrow-button' style='font-size:18px;font-weight: 600;'>+</div>" +                                        
            "</td></tr>" +                                        
            "</table>";
 
        newP.innerHTML = sQuestion;
 
        question_box.appendChild(newP);                                
 
    }
    else if ( gQuestionType == "입력형" )
    {
        // 입력형은 질문항목에 대해 응답자가 직접 답을 입력하는 방식(주관식)입니다. 
        sQuestion = "<table style='width:850px;margin-top:25px;'>" +
            "<tr>" +
                "<td style='width:50px;vertical-align: top;font-size:19px;font-weight:600;'>" +
                    "<div style='margin-top:5px;'>Q</div>" +
                "</td>" +
                "<td style='width:1150px'>" +
                    "<input type = 'hidden' name = 'question" + gQuestionNum + "_type' value = '입력형'>" +
                    "<input type = 'text' id = 'question" + gQuestionNum + "' name = 'question" + gQuestionNum + "' style='width:550px;margin-bottom:5px;float:left;margin-right:30px;' placeholder='질문'>                                    " +
                    "<div onclick = 'RemoveQuestion(" + gQuestionNum + ")' class='arrow-button' style='margin-top:1px' >X</div>" +
                    "<div id = 'item" + gQuestionNum + "'>" +
                        "<div id = 'item_list" + gQuestionNum + "'>" +
                        "</div>" +                                                    
                    "</div>" +                                                
                "</td>" +
            "</tr>" +                                        
            "</table>";
 
        newP.innerHTML = sQuestion;
 
        question_box.appendChild(newP);                                
 
    }
 
}    
cs

 

 

 

위 코드 중에서 RemoveQuestion() 함수는 생성된 입력폼을 삭제할때 호출되는 함수입니다. 함수의 인자로 질문번호가 전달되며, RemoveQuestion()함수에서는 전달받은 질문번호를 이용하여 질문DIV의 ID를 만들어 삭제하게 됩니다. 

 

1
2
3
4
5
6
7
function RemoveQuestion(nQuestionNum)
{
  question_box = document.getElementById("question_box");
target_question = document.getElementById("question" + nQuestionNum);
  question_box.removeChild(target_question);                               
}
cs

 

 

아울러, AddItem() 함수는 질문에 대한 선택옵션을 개별로 추가하기 위한 함수로서, 동적으로 생성되는 입력폼 하단에 위치한 버튼에 의해 호출됩니다. 

 

 

 

 

AddItem 함수 호출시에는 질문번호인 nQuestionNum 이 인자로 전달됩니다. 이 질문번호를 이용하여 선택항목을 둘러싸고 있는 item_list DIV를 찾아서 동적생성된 입력폼을 추가하게 됩니다. 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//###########################################################
//# 항목추가버튼 + 클릭시 호출되며, 항목을 하나 추가한다 
//###########################################################
function AddItem(nQuestionNum)
{
    item_list = document.getElementById("item_list" + nQuestionNum);
 
    gArItemNum[nQuestionNum] += 1;
 
    var nItemNum = gArItemNum[nQuestionNum];
 
    const newP = document.createElement('p');                                                                
    newP.id = "item" + nQuestionNum + "_" + nItemNum;
 
 
    var ItemName = "array_item_" + nQuestionNum + "[]";
    var ItemId   = "item_id_" + nQuestionNum + "_" + nItemNum;
 
    newP.innerHTML = "<table>" +
                "<tr>" +
                "   <td>" +  
                "       <input type = 'text' id = '" + ItemId + "' name = '" + ItemName + "' style='width:550px;margin-top:5px;' placeholder='항목입력'>" +
                "   </td>" +
                "   <td style='width:250px'>" + 
                "       <div onclick = \"javascript:MoveItem('UP','" + nQuestionNum + "','" + ItemId + "')\" class='arrow-button'>▲</div>" +
                "       <div onclick = \"javascript:MoveItem('DOWN','" + nQuestionNum + "','" + ItemId + "')\" class='arrow-button'>▼</div>" +
                "       <div onclick = \"javascript:RemoveItem('" + nQuestionNum + "','" + newP.id + "')\" class='arrow-button'>X</div>" +
                "   </td>" +
                "</tr>" +
                "</table>";
 
 
    item_list.appendChild(newP);   
    
}
cs

 

 

실전에서 작업하면서, 그때그때 수정하다보니 코드가 좀 지저분 합니다... 양해바랍니다^^

 

 

 

반응형

관련글 더보기

댓글 영역