본문 바로가기
JavaScript./Vanila JS

이벤트 리스너 | 렌더링시 display 속성 가져오지 못하는 문제

by dev챙 2024. 2. 28.

이벤트리스너 사용방법

  1. 적용시킬 HTML 속성을 가져온다.
  2. 적용시킬 이벤트함수를 만든다
  3. 가져온 HTML 속성을 담은 변수에 어떤 이벤트를 했을 때, 함수를 실행할 지 정한다.
<body>
  <button>클릭</button>
</body>
const button = document.querySelector("button");

function handler (e) {
  console.log("클릭되었습니다");
}

button.addEventListener("click", handler);

주의

처음 HTML요소 중 style프로퍼티의 경우 HTML 요소에 인라인 스타일로 직접 설정된 속성만을 반환합니다.
초기 설정이 ""로 세팅이 되어있다는 점을 기억합시다.
아래 코드 기준으로 생각했을 때
js에서 handler함수를 실행해도 바로 css가 적용되는게 아닙니다.
초기에는 JavaScript 코드에서 직접 스타일을 설정했지만, 첫 번째 클릭 이후에는 스타일이 변경되고 이 변경은 인라인 스타일이 아니기 때문에 container.style.display는 "none"이 아닌 ""을 반환합니다.

See the Pen Untitled by Chaeyoung (@Chaeyoung-the-animator) on CodePen.

위 코드에서 css에서 display:none 일 경우 if문이 실행되게 해두었는데, 막상 처음 click 버튼을 누르면 handle함수에서 if문 코드블럭이 실행되는게 아니라 else문 코드블럭이 실행되는 것을 알 수 있습니다. 그 이유는 위에 언급했듯이 처음 HTML 요소에 인라인 스타일로 직접 설정된 속성만을 반환하기 때문에 처음에는 console로 container.style을 확인했을 때 display:""임을 확인할 수 있습니다.

따라서 바로 click을 눌렀을때 .container의 스타일 조건을 명시해주는게 중요합니다. if문으로 들어가게하려면 if문 조건에 초기값을 OR연산자를 지정해주거나 HTML 에서 인라인 스타일을 적용하면 해결됩니다.

function handler() {
  if (container.style.display === "none" || container.style.display === "") {
    container.style.display = "flex";
    openButton.style.display = "none";
  } else {
    container.style.display = "none";
    openButton.style.display = "block";
  }
}

어떤 방법을 사용할지는 상황에 맞춰 적용하도록 합시다.