본문 바로가기
Development/Web(HTML, CSS, JS)

js로 visibility를 collapse에서 visible로 바꿀 때, 처음 클릭에서는 동작하지 않는 문제

by 식냥 2026. 4. 18.
728x90

웹프로그래밍 시험 준비를 하다가, 특정 행을 클릭했을 때, 그 아래에 숨겨져 있던 행이 나타나게 하는 기능을 구현했다.

근데 첫 번째 클릭에서는 그 행이 나타나지 않았고, 두 번째 클릭부터 나타나는 문제가 있었다.

 

기존 코드

<html>
    <head>
        <style>
            .info {
                visibility: collapse;
                background-color: rgb(237, 237, 237);
                font-style: italic;
                color: rgb(65, 65, 65);
            }
        </style>
    </head>
    <body>
        <table border="1">
            <tr class="movie">
                <td class="num">1</td>
                <td class="title">인터스텔라</td>
                <td class="genre">SF</td>
                <td class="grade">9.0</td>
            </tr>
            <tr class="info">
                <td colspan="4" class="text">title 선택됨 - 장르: genre / 평점: grade</td>
            </tr>
        </table>

        <script>
            let movies = document.getElementsByClassName("movie");
            let infos = document.getElementsByClassName("info");

            for (let i = 0; i < movies.length; i++) {
                movies[i].addEventListener("click", () => change_info(i));
            }

            function change_info(indx) {
                if (infos[indx].style.visibility === "collapse") { // 보이기
                    infos[indx].style.visibility = "visible";
                }
                else { // 감추기
                    infos[indx].style.visibility = "collapse";
                }
            }
        </script>
    </body>
</html>

 

 

만약 infos[indx]의 visibility가 collapse라면, visible로 바꾸는 것이다.

css를 보면 초기 설정이 collapse이므로, 생각대로라면 "collapse"==="collapse"가 되어 동작해야했다.

하지만 맨 처음 클릭했을 때는 동작하지 않았다.

 

그 원인은 style.visibility는 html의 속성에서만 읽을 수 있기 때문이었다.

즉, <style> 태그 안에 있는 내용은 읽어오지 못하므로 맨 처음 로드되었을 때는 ""==="collapse"의 형태로 되어있는 것이다.

그래서 첫 클릭 때는 if 조건이 false가 되므로 else문이 실행되어 다시 collapse가 되는 것이다.

 

해결 방법은 두 조건을 바꿔주면 된다.

기존의 조건은 현 상태가 collapse인지 확인했는데, visible인지 확인하는 조건으로 변경하고 실행 내용도 바꿔주면 된다.

그러면 첫 클릭은 무조건 false이므로 else문이 실행되고, else문에는 visible로 바꾸는 코드가 있어서 info행이 나타난다.

 

수정된 코드

<html>
    <body>
        <script>
            function change_info(indx) {
                if (infos[indx].style.visibility === "visible") { // 감추기
                    infos[indx].style.visibility = "collapse";
                }
                else { // 보이기
                    infos[indx].style.visibility = "visible";
                }
            }
        </script>
    </body>
</html>
728x90
반응형

'Development > Web(HTML, CSS, JS)' 카테고리의 다른 글

body 전역 속성, 본문 내부 태그  (2) 2026.04.17
HTML 태그, head  (0) 2026.04.17