JavaScript

#JavaScript, Element.classList -Web API

FEDeveloper 2021. 3. 19. 23:41

#JavaScript, Element.classList -Web API

#자바스크립트, classList 속성

-----
설명 Description

Element.classList 는 읽기 전용 속성이다. 요소의 클래스 속성의 값을 가져오는 DOM TokenList 를 반환한다.
클래스 리스트를 조작 할 수 있다.

Element.ClassName 대체하는 편리한 방법이다. Element.ClassName은 공백으로 구분되는 문자열로 클래스 목록에 접근하는 방식으로 공백제거와 정규표현식(Regular expression)을 사용해야 하는 번거로움이 있다.

-----
구문 Syntax

var elementClasses = elementNodeReference.classList;

var 변수명 = 요소.classList;

 

반환 Returns

DOMTokenList는 요소의 클래스 속성값(클래스명)을 나타낸다. 만약 클래스 속성값(클래스명)이 없을 경우, 빈 DOMTokenList를 반환한다(DOMTokenList.length = 0).

DOMTokenList는 읽기 전용이지만, .add().remove() 메소드를 사용해 클래스 속성값(클래스명)조작할 수 있다.

-----
메서드 Method

.add(String [, string [,...]])
클래스 속성 값을 추가한다. 여러개를 한번에 추가 할 수도 있다.
만약 추가하려는 클래스가 요소의 class 속성에 이미 있다면 무시한다.

.remove(String [, string [,...]])
클래스 속성 값을 삭제한다. 여러개를 한번에 삭제 할 수도 있다.
만약 추가하려는 클래스가 요소의 class 속성에 없거나 정의되지 않았다면 에러를 발생시키지 않고 무시한다.

.item(index)
콜렉션의 인덱스를 이용해 클래스

.toggle(String [, true|false])
인수가 하나일 경우: 클래스 속성값을 토글링한다.
인수가 두개일 경우: 두번째 인수 평가 값이 true이면 클래스 속성값을 추가하고, false이면 제거한다.

.contains(String)
지정한 클래스 값이 요소의 class 속성 값에 존재하는지 확인한다.

.replace(기존 클래스명, 새로운 클래스명)
기존 클래스명을 새로운 클래스명으로 변경한다.

-----
예제 Example Code

기본 예제

const div = document.createElement('div'); // div 태그 만들고 div 변수에 참조 시키기
div.className = 'foo'; // foo 클래스명 저장

console.log(div.outerHTML); // <div class="foo"></div>

div.classList.remove("foo"); // .remove() 메소드로 .foo 삭제하기
div.classList.add("anotherclass"); // .add() 메소드로 .anotherclass 설정하기

console.log(div.outerHTML); // <div class="anotherclass"></div>

console.log(div.classList.length); // 1 : 클래스리스트 개수 

console.log(div.classList.item(0)); // anotherclass : 첫 번째 인덱스

div.classList.toggle("visible"); // .visible 토글시키기

// 2번째 인수로 boolean을 선택적으로 사용 할 수 있다.
div.classList.toggle("visible", i < 10 ); // i가 10보다 작을 경우, .visible 클래스명 토글시키기

console.log(div.classList.contains("foo")); // .foo 클래스명이 있는지 없는지 확인하기. 

div.classList.add("foo", "bar", "baz"); // 여러개의 클래스명 한번에 추가

div.classList.remove("foo", "bar", "baz"); // 여러개의 클래스명 한번에 삭제

div.classList.replace("anotherclass", "bar"); // .anotherclass를 .bar로 변경하기

 

 

폴백(Fallback) 예제: add
IE9 이전 버전용 크로스브라우징 소스

var div, name, arr; // 변수 선언
div = document.createElement('div'); // div 태그 만들고 div 변수에 참조 시키기
div.className = 'foo'; // foo 클래스명 추가

if (div.classList) { // div 요소에 classList가 있는지 확인
  div.classList.add("mystyle"); // mystyle 클래스명 추가
} else {
  name = "mystyle";
  arr = div.className.split(" "); // 공백으로 분리
  if (arr.indexOf(name) == -1) { // 추가할 클래스명이 있는지 확인, 없을 경우 if문 실행
    div.className += " " + name; 
  }
}

폴백(Fallback) 예제: remove
IE9 이전 버전용 크로스브라우징 소스

if (div.classList) { // div 요소에 classList가 있는지 확인
  div.classList.remove("mystyle"); // mystyle 클래스명 삭제
} else { // div 요소에 classList가 없을 경우
  div.className = div.className.replace(/\bmystyle\b/g, ""); // mystyle 클래스명 삭제
}

폴백(Fallback) 예제: contains
IE9 이전 버전용 크로스브라우징 소스

if (div.classList) { // div 요소에 classList가 있는지 확인
  console.log(div.classList.contains("mystyle")); 
} else { // div 요소에 classList가 없을 경우
  console.log(/\bmystyle\b/g.test(div.className)); // mystyle 클래스명이 있을 경우 true, 없을 경우 false
}

 

폴백(Fallback) 예제: toggle
IE9 이전 버전용 크로스브라우징 소스

if (div.classList) { // div 요소에 classList가 있는지 확인
  div.classList.toggle("mystyle"); 
} else { // div 요소에 classList가 없을 경우
  var classes = div.className.split(" "); // 공백을 기준으로 클래스 속성명을 분리
  var i = classes.indexOf("mystyle"); // .mystyle클래스의 인덱스 확인

  if(i >= 0){ // .mystyle 클래스가 있을 경우 
     classes.splice(i, 1); // 배열에서 .mystyle 클래스명 삭제
  }else{ // .mystyle 클래스가 없을 경우 
     classes.push("mystyle"); // 배열에서 .mystyle 클래스명 추가
     div.className = classes.join(" "); // 배열 공백 기준으로 합치기
  }
  console.log(/\bmystyle\b/g.test(div.className)); // mystyle 클래스명이 있을 경우 true, 없을 경우 false
}

 

-----
폴리필 Polyfill

MDN 사이트에서 폴리필을 제공하고 있지만, 그대로 적용 할 경우 IE에서 제대로 작동하지 않아 수정했다.
.add, .remove(), toggle(), .contain() 메소드 모두 사용 가능하다.(.replace() 메소드 제외)
IE9부터 사용가능한 폴리필 경로: how2frontend.tistory.com/entry/classList?category=924762

 

classList

console.log('polyfill classList'); if ("document" in self) { // Full polyfill for browsers with no classList support // Including IE < Edge missing SVGElement.classList if (!("classList" in document..

how2frontend.tistory.com

 

MDN 폴리필 경로: https://developer.mozilla.org/en-US/docs/Web/API/Element/classList#polyfill

 

Element.classList - Web APIs | MDN

Element.classList The Element.classList is a read-only property that returns a live DOMTokenList collection of the class attributes of the element. This can then be used to manipulate the class list. Using classList is a convenient alternative to accessing

developer.mozilla.org

 

-----
브라우저 호환성 Cross Browsing

IE10이상부터 지원되지만, 모든 메소드를 사용할 수 있는 건 아니다.
polyfill을 사용하거나 className을 적용하는게 좋을 것 같다.

-----
명세

dom.spec.whatwg.org/#dom-element-classlist

 

DOM Standard

 

dom.spec.whatwg.org

-----

참고 사이트

https://developer.mozilla.org/ko/docs/Web/API/Element/classList

 

Element.classList - Web API | MDN

Element.classList Element.classList는 엘리먼트의 클래스 속성의 컬렉션인 활성 DOMTokenList를 반환하는 읽기 전용 프로퍼티이다. classList 사용은 공백으로 구분된 문자열인 element.className을 통해 엘리먼트

developer.mozilla.org

https://developer.mozilla.org/en-US/docs/Web/API/Element/classList

 

Element.classList - Web APIs | MDN

Element.classList The Element.classList is a read-only property that returns a live DOMTokenList collection of the class attributes of the element. This can then be used to manipulate the class list. Using classList is a convenient alternative to accessing

developer.mozilla.org

www.w3schools.com/jsref/met_element_getattribute.asp

 

DOM Element getAttribute() Method

HTML DOM getAttribute() Method > Element Object Example Get the value of the class attribute of an

 

www.w3schools.com