본문 바로가기
728x90
반응형

 

 

 

기능 설명

 

1. 체크박스를 이용하여 한번에 여러항목들을 좌, 우 div 로 이동가능

2. 여러 항목들을 상하 위치 조절

3. 검색기능을 통하여 원하는 데이터만 표시 후 이동 가능(나머지는 hidden 처리)

4. 별도 DB 없이 LocalStorage 를 활용

 


 

head 및 body 코드

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Text Interaction</title>

    <style>
        /* Styling */
        .container {
            display: flex;
            justify-content: space-around;
            align-items: center;
            margin-top: 50px;
        }

        .content-div {

            border: 1px solid #000;
            padding: 20px;
            width: 200px; /* Increased width */
            display: flex;
            align-items: center;
            justify-content: center;
            flex-direction: column; /* Change to column to stack children vertically */
        }

        .arrow-buttons {
            display: flex;
            flex-direction: column;
            align-items: center;
        }

        .arrow-buttons button {
            margin: 5px 0;
        }
    </style>
</head>

 

<body>
    <div class="input-container">
        <input type="text" id="textInput" placeholder="텍스트 입력">
        <button id="searchButton">검색</button>
    </div>

        <div class="container" id="container">
            <div id="content-left" class="content-div">
            </div>
    
            <div class="arrow-buttons">
                <button id="leftArrow">◁</button>
                <button id="rightArrow">▷</button>
                <button id="upArrow">△</button>
                <button id="downArrow">▽</button>
            </div>
    
            <div id="content-right" class="content-div">
            </div>
        </div> 
    <button id="saveButton" class="save">저장</button>

 

기본 틀만 만들었고, 내용은 JavaScript 를 이용하여 동적 구성 예정

 

 

 

script

1. 항목 리스트에 들어갈 값들 초기화

        const textInput = document.getElementById("textInput");
        const searchButton = document.getElementById("searchButton");
        const leftArrow = document.getElementById("leftArrow");
        const rightArrow = document.getElementById("rightArrow");
        const upArrow = document.getElementById("upArrow");
        const downArrow = document.getElementById("downArrow");
        const saveButton = document.getElementById("saveButton");

        var mylist = [];
        mylist.push({"id" : "1", "position":"0", "text": "1번데이터", "sort" : "1"});
        mylist.push({"id" : "2", "position":"0", "text": "2번데이터", "sort" : "2"});
        mylist.push({"id" : "3", "position":"0", "text": "3번데이터", "sort" : "3"});
        mylist.push({"id" : "4", "position":"0", "text": "4번데이터", "sort" : "4"});
        mylist.push({"id" : "5", "position":"0", "text": "5번데이터", "sort" : "5"});
        mylist.push({"id" : "6", "position":"0", "text": "6번데이터", "sort" : "6"});
        mylist.push({"id" : "7", "position":"0", "text": "7번데이터", "sort" : "7"});
        mylist.push({"id" : "8", "position":"0", "text": "8번데이터", "sort" : "8"});
        mylist.push({"id" : "9", "position":"0", "text": "9번데이터", "sort" : "9"});
        mylist.push({"id" : "10", "position":"0", "text": "10번데이터", "sort" : "10"});
        mylist.push({"id" : "11", "position":"0", "text": "11번데이터", "sort" : "11"});
        mylist.push({"id" : "12", "position":"0", "text": "12번데이터", "sort" : "12"});

        
        if(!localStorage.getItem('mylist')){
            localStorage.setItem('mylist', JSON.stringify(mylist));  
        }
        mylist =  JSON.parse(localStorage.getItem('mylist'));

 

LocalStorage 에 들어갈 list 값 초기화

 

id 로 개별 값을,

position 을 통해 좌, 우 div 구분

text 로 value 값

sort 로 div 항목내에서 순서 구분

 

아래 if문을 통하여 초기값이 없을 경우에만 위 내용으로 초기화

 

2. LocalStorage 에 저장된 값을 화면에 그리기

		//HTML 값 만들기
		var makeHTML = element => {
            let innerHTML = `<div><label for="${element.id}"><input type="checkbox" id="${element.id}" value="${element.text}">${element.text}</label></div>`
            return innerHTML;
            }
        //list.sort 를 이용하여 sort 값 비교후 소팅
        var sortList = list => {
            return list.sort((a,b) => parseInt(a.sort) - parseInt(b.sort));
            }
        
        //최종 sort 된 list
        var sortedList = sortList(mylist);
        sortedList.forEach(element => {
            if(element.position == 0){
                document.getElementById('content-left').innerHTML += makeHTML(element);
            }else{
                document.getElementById('content-right').innerHTML += makeHTML(element);
            };
        });

 

 

3,. 검색 버튼 클릭 시 이벤트 처리

        // 검색 버튼 클릭 시 이벤트 처리
        searchButton.addEventListener("click", function() {
            let searchWord = textInput.value; 
            let searchList_l = Array.from(document.getElementById('content-left').children);
            for(let i = 0 ; i < searchList_l.length ; i++ ){
                if(searchWord != searchList_l[i].children[0].children[0].value){
                    searchList_l[i].hidden=true
                }
            }
            let searchList_r = Array.from(document.getElementById('content-right').children);
            for(let i = 0 ; i < searchList_r.length ; i++ ){
                if(searchWord != searchList_r[i].children[0].children[0].value){
                    searchList_r[i].hidden=true
                }
            }            
        });

 

검색한 항목이외는 hidden=true 옵션을 통하여 화면에서 보이진 않지만, form 처리 시 값은 유지

_l, _r 을 통해 좌 우 div 모두 적용 (아래 계속 _l, _r 로 구분하였음)

 

4. 좌우 화살표 이벤트 처리 (클릭시 div 이동)

        // 좌우 화살표 버튼 클릭 시 이벤트 처리
        leftArrow.addEventListener("click", function() {
            let checkboxes = document.querySelectorAll('#container input[type="checkbox"]:checked');
            let targetContentDiv = document.getElementById("content-left");
            checkboxes.forEach(checkbox => {
                let targetDiv = checkbox.parentElement.parentElement;
                targetContentDiv.appendChild(targetDiv);
            });
        });
        
   		//check된 항목들을 찾아서 targetDiv로 이동시킴.

        rightArrow.addEventListener("click", function() {
            let checkboxes = document.querySelectorAll('#container input[type="checkbox"]:checked');
            let targetContentDiv = document.getElementById("content-right");
            checkboxes.forEach(checkbox => {
                let targetDiv = checkbox.parentElement.parentElement;
                targetContentDiv.appendChild(targetDiv);
            });
        });

 

5. 상, 하 화살표 이벤트 처리 (항목 순서 바꾸기)

 


        // 상하 화살표 버튼 클릭 시 이벤트 처리
        upArrow.addEventListener("click", function() {
            //좌측 div 처리
            let container_l = document.getElementById('content-left');
            let checkedDivs_l = [];
            let leftflag = false;

            Array.from(container_l.children).forEach(div =>{
                let checkbox = div.querySelector('input[type="checkbox"]');
                if(checkbox && checkbox.checked){
                    checkedDivs_l.push(div);
                    leftflag = true;
                }
            });

            if(leftflag){
                checkedDivs_l.forEach(div =>{
                    let curIndex = Array.from(container_l.children).indexOf(div);
                    if(curIndex > 0){
                        container_l.insertBefore(div, container_l.children[curIndex - 1]);
                    }
                })
            }

            //우측 div 처리
            let container_r = document.getElementById('content-right');
            let checkedDivs_r = [];
            let rightflag = false;

            Array.from(container_r.children).forEach(div =>{
                let checkbox = div.querySelector('input[type="checkbox"]');
                if(checkbox && checkbox.checked){
                    checkedDivs_r.push(div);
                    rightflag = true;
                }
            });
            if(rightflag){
                checkedDivs_r.forEach(div =>{
                    let curIndex = Array.from(container_r.children).indexOf(div);
                    if(curIndex > 0){
                        container_r.insertBefore(div, container_r.children[curIndex - 1]);
                    }
                })
            }
        });

        downArrow.addEventListener("click", function() {
            
            let container_l = document.getElementById('content-left');
            let checkedDivs_l = [];
            let leftflag = false;

            Array.from(container_l.children).forEach(div =>{
                let checkbox = div.querySelector('input[type="checkbox"]');
                if(checkbox && checkbox.checked){
                    checkedDivs_l.push(div);
                    leftflag = true;
                }
            });
            if(leftflag){
                //index 로 계산해서 순서 변경하기위해 insertBefore 를 사용하였는데, reverse 를 하지않으면 위에서부터 계산해서 내려옴.
                //위 객체부터 index +2 를 하다보면, 그 아래객체에 index+2 를 하여도 기존 index 를 그대로 유지하기에 아래부터 계산해야 순차적으로 내려갈 수있다. 
                checkedDivs_l.reverse(); 
                checkedDivs_l.forEach(div =>{
                    let curIndex = Array.from(container_l.children).indexOf(div);
                    if(curIndex < container_l.children.length - 1){
                        container_l.insertBefore(div, container_l.children[curIndex + 2]);
                    }
                })
            }

            let container_r = document.getElementById('content-right');
            let checkedDivs_r = [];
            let rightflag = false;
            Array.from(container_r.children).forEach(div =>{
                let checkbox = div.querySelector('input[type="checkbox"]');
                if(checkbox && checkbox.checked){
                    checkedDivs_r.push(div);
                    rightflag = true;
                }
            });
            if(rightflag){
                checkedDivs_r.reverse();
                checkedDivs_r.forEach(div =>{
                    let curIndex = Array.from(container_r.children).indexOf(div);
                    if(curIndex < container_r.children.length - 1){
                        container_r.insertBefore(div, container_r.children[curIndex + 2]);
                    }
                })
            }
        });

 

insertBefore 라는 함수를 이용하였는데, 이 함수는 해당번째로 객체를 삽입시켜줌.

 

 

6. 저장 버튼 클릭시 변경된 내용 LocalStorage 에 저장

        // 저장 버튼 클릭 시 이벤트 처리
        saveButton.addEventListener("click", function() {
            event.preventDefault(); // 기본 제출 동작 방지
            
            let container_l = document.getElementById('content-left');
            let container_r = document.getElementById('content-right');
            let list = [];
            let idx = 1;

            Array.from(container_l.children).forEach(div =>{
                let obj = div.querySelector('input[type="checkbox"]');
                list.push({"id" : obj.id, "text" : obj.value, "position" : "0", "sort" : idx++});
            });
            
            Array.from(container_r.children).forEach(div =>{
                let obj = div.querySelector('input[type="checkbox"]');
                list.push({"id" : obj.id, "text" : obj.value, "position" : "1", "sort" : idx++});
            });

            localStorage.setItem('mylist', JSON.stringify(list));
            location.reload();

        });
728x90
반응형

한걸음 한걸음

개인적인 기록