글자를 클릭하면 주황색, 다시 클릭하면 파랑색, 다시 클릭하면 주황색... 무한 반복되는 예제이다.
클릭하면 <h1>태그의 class에 active를 추가하고 다시 클릭하면 active를 삭제하고, 다시 클릭하면 추가하는..무한 반복되는 방식이다.
const h1 = document.querySelector("h1");
function clickEvent(){
if(h1.className === "active"){
h1.className = "";
} else {
h1.className = "active";
}
}
h1.addEventListener("click", clickEvent);
위 예제는 스트링 "active"가 반복된다. 예제에서는 상관없겠지만 코드가 길어지고, class이름이 수정 된다면? 일일이 다 고쳐야 할것이다. 그러다 오타가 날 수도 있다. 그래서 아래의 예제는 class이름을 한번만 수정하면 되도록 코드를 수정하였다.
const h1 = document.querySelector("h1");
function clickEvent(){
const activeClass = "active";
if(h1.className === activeClass){
h1.className = "";
} else {
h1.className = activeClass;
}
}
h1.addEventListener("click", clickEvent);
위 예제는 잘 작동하는것 같지만 버그가 발생한다. 이미 <h1>에 class가 있는 경우이다.
예를들어 <h1 class="title"> 이라고 이미 class가 있으면, 클릭했을 때 "active"가 클래스에 추가되는것이 아니라 통째로 바뀐다. 즉, <h1 class="active">로 바뀐다. (기존의 class가 사라짐)
아래는 해결코드이다.
Element.classList
classList는 읽기 전용 프로퍼티입니다.
- classList.add(String) : 지정한 클래스 값을 추가. 만약 추가하려는 클래스가 엘리먼트의 class 속성에 이미 존재한다면 무시한다.
- classList.remove(String) : 지정한 클래스 값을 제거
! 존재하지 않는 클래스를 제거하는 것은 에러를 발생하지 않는다. - classList.contains(String) : 지정한 클래스 값이 엘리먼트의 class 속성에 존재하는지 확인한다.
- classList.replace(oldClass, newClass) : 존재하는 클래스를 새로운 클래스로 교체
- classList.toggle(String) : 클래스 속성값이 없는 경우 추가하며 추가했을 경우 다시 제거 그리고 반복한다.
const h1 = document.querySelector("h1");
function clickEvent(){
const activeClass = "active";
if(h1.classList.contains(activeClass)){
h1.classList.remove(activeClass);
} else {
h1.classList.add(activeClass);
}
}
h1.addEventListener("click", clickEvent);
위의 예제는 classList.contains로 클래스의 존재를 확인한 후, 존재하면(true) active를 지우고, 존재하지않으면(false) active를 추가하는 코드입니다.
아래는 더 함축된 코드입니다.
const h1 = document.querySelector("h1");
function clickEvent(){
h1.classList.toggle("active");
};
h1.addEventListener("click", clickEvent);
반응형
'JAVASCRIPT' 카테고리의 다른 글
JAVASCRIPT ) 숫자 & 문자 (0) | 2024.07.01 |
---|---|
HTML<canvas>, 자바스크립트로 그림판 만들기 01 (0) | 2022.12.16 |
Javascript addEventListener() - 이벤트 리스너 사용법과 종류 (0) | 2022.05.03 |
Javascript document - HTML 요소 선택 메소드 (0) | 2022.05.02 |
Javascript 연산자 - 연산자 우선순위 (0) | 2022.05.02 |