data- 속성 (Data Attribute)
- HTML 요소에 사용자 정의 데이터를 저장하기 위한 속성입니다.
- data- 접두사로 시작하며, 브라우저는 이 접두사를 통해 사용자 정의 속성임을 인식합니다.
- HTML 요소와 데이터를 연결하거나, JavaScript 코드의 복잡성을 줄이는 데 사용됩니다.
- CSS 속성 선택자를 사용하여 스타일을 적용할 수 있습니다.
- data-target-id와 같이 하이픈(-)으로 구분된 속성 이름은 JavaScript에서 dataset 속성을 통해 접근할 때 카멜 케이스로 변환됩니다. (예: element.dataset.targetId)
dataset 속성
- HTML 요소의 모든 data-* 속성을 키-값 쌍으로 갖는 DOMStringMap 객체를 반환하는 JavaScript 속성입니다.
- data-* 속성 값에 접근하고 조작하는 데 사용됩니다.
- data- 접두사를 제거하고, 하이픈(-)으로 구분된 이름은 카멜 케이스로 변환하여 사용합니다.
- 브라우저가 data- 접두사를 기반으로 데이터 속성을 인식하고 처리하므로, 접두사를 변경하면 dataset 속성을 사용할 수 없습니다.
카멜 케이스 변환 규칙
카멜 케이스(Camel Case)는 프로그래밍에서 변수, 함수, 객체 등의 이름을 지을 때 사용하는 명명 규칙 중 하나이다.
마치 낙타의 등처럼 중간에 대문자가 솟아 있는 모양과 비슷하다고 해서 카멜 케이스라는 이름이 붙었다.
카멜 케이스 변환 규칙:
- data- 접두사 제거:
- HTML 속성 이름에서 data- 접두사를 제거한다.
- 하이픈(-) 기준 단어 분리:
- 하이픈(-)을 기준으로 단어를 분리한다.
- 첫 번째 단어는 소문자 유지:
- 첫 번째 단어는 그대로 소문자를 유지한다.
- 이후 단어 첫 글자 대문자 변환:
- 두 번째 단어부터는 각 단어의 첫 글자를 대문자로 변환한다.
- 단어 연결:
- 변환된 단어들을 연결하여 JavaScript 속성 이름을 생성한다.
HTML 속성 이름 | JavaScript 속성 이름 | 설명 |
data-user-name | userName |
user (첫 번째 단어, 소문자 유지) + Name (두 번째 단어, 첫 글자 대문자 변환)
|
data-product-price | productPrice |
product (첫 번째 단어, 소문자 유지) + Price (두 번째 단어, 첫 글자 대문자 변환)
|
data-is-logged-in | isLoggedIn |
is (첫 번째 단어, 소문자 유지) + Logged (두 번째 단어, 첫 글자 대문자 변환) + In (세 번째 단어, 첫 글자 대문자 변환)
|
data-calculate-total-amount | calculateTotalAmount |
calculate (첫 번째 단어, 소문자 유지) + Total (두 번째 단어, 첫 글자 대문자 변환) + Amount (세 번째 단어, 첫 글자 대문자 변환)
|
data-message-dialog | messageDialog |
message (첫 번째 단어, 소문자 유지) + Dialog (두 번째 단어, 첫 글자 대문자 변환)
|
data-very-long-attribute-name | veryLongAttributeName |
very (첫 번째 단어, 소문자 유지) + Long (두 번째 단어, 첫 글자 대문자 변환) + Attribute (세 번째 단어, 첫 글자 대문자 변환) + Name (네 번째 단어, 첫 글자 대문자 변환)
|
주요 내용 요약
- data-* 속성은 HTML 요소에 사용자 정의 데이터를 저장하고 JavaScript에서 활용하기 위한 속성이다.
- dataset 속성은 JavaScript에서 data-* 속성 값에 접근하고 조작하는 데 사용된다.
- data-* 속성 이름은 JavaScript에서 dataset 속성을 통해 접근할 때 카멜 케이스로 변환된다.
- data- 접두사를 변경하면 dataset 속성을 사용할 수 없으므로, 표준 규칙을 따르는 것이 좋다.
실 사용 예시
<div class="tab-menu">
<button data-tab-id="tab1" class="tab-button active">탭 1</button>
<button data-tab-id="tab2" class="tab-button">탭 2</button>
<button data-tab-id="tab3" class="tab-button">탭 3</button>
</div>
<div class="tab-content">
<div id="tab1" class="tab-panel active">탭 1 내용</div>
<div id="tab2" class="tab-panel">탭 2 내용</div>
<div id="tab3" class="tab-panel">탭 3 내용</div>
</div>
data-tab-id="tab1" 로 속성을 부여함 여기서 tab1은 문자열이지만 숫자, 불리언, JSON 객체 등 다양한 데이터 타입을 사용할 수 있다.
여기서 data-tab-id="tab1"의 tab1 속성을 반환하려면 아래와 같은 코드를 사용해야한다.
const tabButton = document.querySelector('[data-tab-id="tab1"]');
if (tabButton) {
const tabId = tabButton.dataset.tabId;
console.log(tabId); // 출력: tab1
} else {
console.log("data-tab-id가 tab1인 요소를 찾을 수 없습니다.");
}
여기서
const tabId = tabButton.dataset.tabId; 에서 변수 tabId와 tabButton.dataset.tabId;의 속성 .tabId가 이름이 똑같아서 헷갈릴 수 있는데 변수 이름은 뭐로 바꾸든 상관없다.
data-tab-id="tab1"에서
- data-tab-id: 속성 이름(Attribute Name)
- tab1: 속성 값(Attribute Value)
이다.
이벤트 위임을 사용하는 법
const tabMenu = document.querySelector(".tab-menu");
tabMenu.addEventListener("click", function (event) {
const target = event.target;
if (target.dataset.tabId === "tab1") {
console.log(target.dataset.tabId); // 출력: tab1
}
});
'자바 스크립트(java script) > 개념 조각' 카테고리의 다른 글
구조 분해 할당 (0) | 2025.03.24 |
---|---|
변수는 데이터 그 자체가 아니다? (0) | 2025.03.23 |
메모리 구조 (0) | 2025.03.22 |
함수와 메서드(method)란? (0) | 2025.03.21 |
자바스크립트에서 DOM 사용시 알아둘 것 (0) | 2025.03.20 |