JS/[문제해결]

[국비] 배열 및 반복문(for문)_체크 박스 동기화

줌인. 2024. 5. 25. 16:12

[문제 1] 

- 맨 첫번째 체크 박스를 클릭하면 나머지 박스들이 모두 선택되고,

  맨 첫번째 체크 박스를 해제하면 나머지 박스들이 모두 해제되게 구현 

- 모두 체크된 상태에서 한 가지 체크 박스를 해제하면 맨 첫번째 체크 박스 클릭이 해제되고,

  체크가 없는 상태에서 모든 체크 박스를 선택하면 맨 첫번째 체크 박스 클릭이 되도록 구현

<script>
        const checkAll = document.getElementById("checkAll");
        const box = document.getElementsByClassName("box");

        //첫번째 외 체크박스 선택시 첫번째 체크박스 선택 && 외 선택 해제시 첫번쨰 체크박스 해제
        for(let i=0; i < box.length ; i++) {
            box[i].addEventListener("click", function(){
                let count = 0;
                for(let j=0; j<box.length; j++) {
                    if(box[j].checked) {
                        count += 1;
                        }
                }
                if(count >= 4) {
                    checkAll.checked = true;
                } else {
                    checkAll.checked = false;
                }
            })
        }


        //첫번째 박스체크하고 클릭 누르면 나머지도 체크 & 첫번쨰 누르면 모두 해제
        function push() {
            if (checkAll.checked) {
                for(let i=0; i<4 ; i++) {
                    box[i].checked = checkAll.checked;
                }
            } else {
                for(let i=0; i<4 ; i++) {
                    box[i].checked = checkAll.checked;
                }
            }
        }

    </script>

 

문제 인지
루프와 조건문 조합 - 체크 박스 집계 및 누적 접근 방식 고민 (체크박스 동기화)
- for 루프와 조건문 결합
이벤트 핸들링과 함수 - 이벤트 핸들러 내부 for 루프 구현
- 이벤트 핸들러가 언제 발생하는지에 대한 인지
- 이벤트 핸들러가 적용되고, 이를 실행할 때 값들이 변경되는 문제를 인지하지 못함
- 이벤트 핸들러와 별개로 체크박스를 고민하지 못하는 문제

※ 구문별로 나누어 코드 작성 후 결합 진행

 

[접근 로직]

        function result() {
           
            //증가할떄도 호환가능할 수 있도록 구성
            let count = 0;
            for(let i=0; i<box.length; i++) { //클릭(체크와 해제)하면 루프가 한바퀴 도는 것
                if(box[i].checked) { //체크박스에 체크가 된다면
                    count += 1; //result에 숫자가 저장
                }
            }
            //console.log("result = " + count); //--> for구문에서 발생한 체크 박스 내역


            //만약 count 즉 체크박스 4개일시 전체 체크 원함
            if(count >= 4) {
                checkAll.checked = true;
            } else {
                checkAll.checked = false;
            }
 
        }

 

[접근 로직 2]

    <script>
        const checkAll = document.getElementById("checkAll");
        const c1 = document.getElementsByClassName("c1");
        //체크박스가 모두 선택될 때 하나를 해제하면 전체도 해제
        for (let i=0; i <c1.length;i++) {
            c1[i].addEventListener("click", function() { //버튼한개에 체크할 시 -> 루프가 있음을 생각 하지말 것
                //위와 별개로 아래부터 새로 그림을 그린다고 생각하는게 좋음

                let count = 0;

                for(let j=0;j<c1.length;j++) {
                    if(c1[j].checked) { //c1[i]는 --> 이벤트 핸들러가 check되었을떄 기준!
                        //따라서 체크박스 내를 검증하고, 체크박스가 check되었을 때 검증하기 위해선 loop 키워드를 이용
                        count += 1; //count++과 동일하다.
                    }
                }

                if(count >= 4) {
                    checkAll.checked = true;
                } else {
                    checkAll.checked = false;
                }
                //count = 0;
                //이벤트 리스너를 통해서 다시 초기화 상태로 가기 때문에 리셋 시킬 필요가 없다.
            })
        }
    </script>

 

 

! 문제 인지 !

[모두 체크 되었을 때, 체크 박스 해제]

  for(let i=0; i < box.length ; i++) {
            box[i].addEventListener("click", function(){
 
   if(box[0].checked && box[1].checked && box[2].checked && box[3].checked){
            all.checked = true;
         } else {
            all.checked = false;
             }
            })
        }
 

- for 구문을 활용하지 않는 문제 및 새로운 check박스 추가 시 재사용성이 어려운 문제

 

 

[클릭이 4번 이상 되었을 때, 모두 체크]

 
  for(let i=0; i < box.length ; i++) {
            box[i].addEventListener("click", function(){
 
 
        let count = 1;
        if (box[i].checked) {
            count++; 
        }
        if (count >= 4) {
            checkAll.checked = true;
        } else {
            checkAll.checked = false;
        }
            })
        }
 

- 체크박스 유무와 관련없이 오직 클릭이 4번 이상이면, check가 되는 문제가 발생

 

 

[for루프 내 조건]

        for (let i=0; i <c1.length;i++) {
            c1[i].addEventListener("click", function() {

                let count = 0;
                for(let j=0;j<c1.length;j++) {
                    if(c1[i].checked) {
                        count += 1;
                    }
                }

- '이벤트가 발생되는 체크버튼을 클릭했을 때'와 '체크 박스 중에 클릭된 것이 있을 때'의 조건을 구분하지 못하는 문제

- 어떤 조건을 사용하는 것이 적절한지 판단하지 못함


 

[선생님 작성 코드]

        for(let i=0;i<ch.length;i++){
            ch[i].addEventListener("click", function(){
                //최종 결과물을 담을 변수
                let flag=true;

                //4개의 체크박스의 체크 유무를 판단
                for(let j=0;j<ch.length;j++){
                    if(!ch[j].checked){
                        flag=false;
                        break;
                    }
                }

                //최종 결과물을 checkAll에 대입
                checkAll.checked=flag;
               
            })
        }

- 더 유용

728x90