DOM (Document Object Model)은 웹 문서의 구조화된 표현을 제공하며, 프로그래밍 언어를 통해 문서 구조, 스타일 및 내용을 조작할 수 있는 방법을 제공한다. DOM은 웹 문서를 트리 구조로 나타내며, 각 노드는 문서의 일부분, 예를 들면 요소, 속성, 텍스트 등을 나타낸다.
HTML
<!DOCTYPE html>
<html>
<body>
<h2 id="myHeading">Hello World!</h2>
<p>Click the button to change the text of the heading:</p>
<button onclick="changeText()">Click me</button>
<script>
function changeText() {
document.getElementById("myHeading").innerHTML = "Hello DOM!";
}
</script>
</body>
</html>
위의 예제에서 JavaScript 함수 changeText는 DOM을 조작하여 <h2>
요소의 텍스트를 변경한다.
DOM은 웹 개발에서 핵심적인 개념 중 하나이며, 웹 페이지의 동적인 동작을 가능하게 한다. 현대의 프런트엔드 프레임워크나 라이브러리 (예: React, Vue, Angular)는 DOM을 효율적으로 조작하기 위한 더 추상화된 방식을 제공하곤 한다.
DOM (Document Object Model) 내에서 Node와 Element는 중요한 개념이다. 두 개념을 이해하기 위해 트리 구조를 생각하면 도움이 된다. DOM 트리의 각 부분은 "노드(Node)"로 나타나며, 그 중 일부는 "요소(Element)"이다.
<div>, <span>, <a>
)를 나타내는 객체이다.모든 Element는 Node이지만, 모든 Node는 Element가 아니다.
Node는 일반적인 DOM 객체를 나타내며, Element는 특정 태그와 관련된 DOM 객체를 나타낸다.
document.getElementById()는 DOM (Document Object Model) 조작에서 가장 기본적이고 일반적으로 사용되는 메서드 중 하나이다. 이 메서드는 주어진 문자열과 일치하는 ID 속성을 가진 요소를 찾아 반환한다.
let element = document.getElementById(elementId);
예를 들어, 웹 페이지에 다음과 같은 HTML 요소가 있다고 가정해보자.
<div id="myDiv">Hello, World!</div>
이 요소를 JavaScript로 선택하려면 다음과 같이 할 수 있다.
let divElement = document.getElementById("myDiv");
console.log(divElement.innerHTML); // "Hello, World!"
document.querySelector() 메서드는 CSS 선택자를 사용하여 문서에서 일치하는 첫 번째 요소를 반환한다. 만약 일치하는 요소가 없다면 null을 반환한다. 이 메서드는 DOM에 대한 질의를 수행하는 현대적이고 다양한 방법을 제공한다.
let element = document.querySelector(selectors);
<div id="myDiv">Hello, World!</div>
let divElement = document.querySelector("#myDiv");
console.log(divElement.innerHTML); // "Hello, World!"
<div class="myClass">Hello, World!</div>
let divElement = document.querySelector(".myClass");
console.log(divElement.innerHTML); // "Hello, World!"
<p>Paragraph 1</p>
<p>Paragraph 2</p>
let pElement = document.querySelector("p");
console.log(pElement.innerHTML); // "Paragraph 1" (첫 번째로 일치하는 p 요소)
<div class="container">
<p class="highlight">Highlighted text</p>
</div>
let pElement = document.querySelector(".container .highlight");
console.log(pElement.innerHTML); // "Highlighted text"
document.querySelector()는 첫 번째로 일치하는 요소만 반환한다. 선택자와 일치하는 모든 요소를 가져오고 싶다면 document.querySelectorAll()을 사용할 수 있다.
만약 일치하는 요소가 없다면, document.querySelector()는 null을 반환한다. 따라서 요소에 접근하기 전에 반환값이 null이 아닌지 확인하는 것이 좋다.
querySelector와 querySelectorAll은 비교적 최근에 도입된 메서드이므로, 오래된 브라우저에서는 지원되지 않을 수 있다. 하지만 대부분의 최신 브라우저에서는 지원된다.
document.querySelector()는 CSS 선택자를 활용하여 DOM 요소에 빠르게 접근하는 데 매우 유용하다.
document.querySelectorAll() 메서드는 CSS 선택자를 사용하여 문서에서 일치하는 모든 요소를 NodeList 객체로 반환한다. 만약 일치하는 요소가 없다면, 빈 NodeList를 반환한다.
let nodeList = document.querySelectorAll(selectors);
<div class="example">Example 1</div>
<div class="example">Example 2</div>
let divElements = document.querySelectorAll(".example");
divElements.forEach(div => console.log(div.innerHTML));
// 출력:
// "Example 1"
// "Example 2"
<p>Paragraph 1</p>
<p>Paragraph 2</p>
let pElements = document.querySelectorAll("p");
pElements.forEach(p => console.log(p.innerHTML));
// 출력:
// "Paragraph 1"
// "Paragraph 2"
<div class="container">
<p class="highlight">Highlighted text 1</p>
<p class="highlight">Highlighted text 2</p>
</div>
let pElements = document.querySelectorAll(".container .highlight");
pElements.forEach(p => console.log(p.innerHTML));
// 출력:
// "Highlighted text 1"
// "Highlighted text 2"
document.querySelectorAll()가 반환하는 NodeList 객체는 유사 배열이다. 이는 배열과 유사하게 인덱스로 요소에 접근할 수 있지만, 배열의 모든 메서드 (예: push나 pop)를 가지고 있지는 않습니다. 그러나 forEach와 같은 몇몇 메서드는 사용할 수 있다.
반환된 NodeList는 정적(static)이다. 이는 DOM의 변경 사항을 실시간으로 반영하지 않는다는 것을 의미한다. 이와는 대조적으로 document.getElementsByTagName과 같은 다른 메서드들은 실시간으로 반영하는 라이브 NodeList를 반환하기도 한다.
만약 일치하는 요소가 없다면, document.querySelectorAll()는 빈 NodeList를 반환한다.
document.querySelectorAll()는 CSS 선택자를 활용하여 여러 DOM 요소에 빠르게 접근하는 데 유용하게 사용된다.
parentElement 속성은 주어진 요소의 부모 요소를 반환한다. 만약 부모 요소가 없거나 (예: 주어진 요소가 문서의 최상위 요소인 경우) 부모가 DOM 요소가 아닌 경우 (예: Document나 DocumentFragment)에는 null을 반환한다.
let parent = element.parentElement;
<div id="container">
<p id="paragraph">Hello, World!</p>
</div>
let paraElement = document.getElementById("paragraph");
let parentOfPara = paraElement.parentElement;
console.log(parentOfPara.id); // "container"
위의 예제에서, p 요소의 parentElement 속성을 사용하여 그 부모인 div 요소를 얻는다.
parentElement와 매우 유사한 속성인 parentNode가 있다. 둘 다 요소의 부모를 반환하지만, parentNode는 요소의 부모가 꼭 DOM 요소일 필요가 없다. 즉, 부모가 Document나 DocumentFragment와 같은 다른 노드 타입일 수 있다. 반면, parentElement는 부모가 DOM 요소일 때만 해당 요소를 반환하고, 그렇지 않은 경우 null을 반환한다.
일반적인 사용에서, 대부분의 경우 parentElement와 parentNode는 동일한 값을 반환하겠지만, 반환되는 노드 타입이 중요한 경우에는 차이점을 고려해야 한다.
Element.closest() 메서드는 현재 요소부터 시작하여 DOM 트리를 위로 탐색하며 주어진 선택자와 일치하는 가장 가까운 조상 요소를 찾는다. 만약 일치하는 요소를 찾지 못한다면 null을 반환한다.
이 메서드는 주어진 요소 자체부터 시작하여 선택자와 일치하는지 확인하고, 그렇지 않다면 부모 요소로 이동하여 확인하는 방식으로 DOM 트리를 계속해서 위로 탐색한다.
let closestElement = element.closest(selectors);
<div id="parent">
<div class="child">
<div class="grandchild">Content</div>
</div>
</div>
let grandchild = document.querySelector(".grandchild");
let closestDiv = grandchild.closest("div");
console.log(closestDiv.className); // "grandchild"
또 다른 예제
let closestChild = grandchild.closest(".child");
console.log(closestChild.className); // "child"
Element.closest() 메서드는 현재 요소로부터 시작하여 주어진 선택자와 일치하는 가장 가까운 조상 요소를 찾는 데 유용하다.
previousSibling과 nextSibling은 DOM에서 노드를 탐색하는 데 사용되는 속성이다. 이 두 속성은 현재 노드와 같은 부모를 가지는 이전 및 다음 노드에 대한 참조를 제공한다.
div id="container">
<!-- Some comment -->
<p>First paragraph</p>
<p id="middle">Second paragraph</p>
<p>Third paragraph</p>
</div>
let middlePara = document.getElementById("middle");
console.log(middlePara.previousSibling); // 이것은 텍스트 노드 (줄 바꿈 또는 공백)를 참조한다.
console.log(middlePara.nextSibling); // 이것은 텍스트 노드 (줄 바꿈 또는 공백)를 참조한다.
만약 요소 노드만을 대상으로 하고 싶다면 previousElementSibling과 nextElementSibling 속성을 사용하면 된다. 이러한 속성들은 텍스트나 주석 노드를 무시하고 요소 노드만을 참조한다.
Element.children은 DOM 요소의 속성으로, 해당 요소의 모든 자식 요소를 나타내는 'HTMLCollection'을 반환한다. 중요한 점은 children 속성이 요소 노드들만 포함하며 텍스트 노드나 주석 노드는 포함하지 않는다는 것이다.
let childElements = element.children;
<div id="container">
<p>First paragraph</p>
<!-- Some comment -->
<p>Second paragraph</p>
<span>Some span</span>
</div>
let container = document.getElementById("container");
let childrenOfContainer = container.children;
console.log(childrenOfContainer.length); // 3
console.log(childrenOfContainer[0].textContent); // "First paragraph"
console.log(childrenOfContainer[1].textContent); // "Second paragraph"
Element.children 속성은 주어진 요소의 자식 요소들만을 대상으로 할 때 매우 유용하게 사용된다.
Element.firstElementChild와 Element.lastElementChild는 DOM 요소의 속성으로, 각각 요소의 첫 번째 자식 요소와 마지막 자식 요소를 참조한다. 이 속성들은 요소 노드만을 대상으로 하기 때문에 텍스트 노드나 주석 노드 등은 무시된다.
<div id="container">
<!-- Some comment -->
<p>First paragraph</p>
<span>Some span</span>
<p>Second paragraph</p>
</div>
let container = document.getElementById("container");
let firstChild = container.firstElementChild;
console.log(firstChild.textContent); // "First paragraph"
let lastChild = container.lastElementChild;
console.log(lastChild.textContent); // "Second paragraph"
이 두 속성은 주어진 요소의 첫 번째 및 마지막 자식 요소를 쉽게 참조할 수 있게 해주어 DOM의 특정 부분에 접근하거나 조작할 때 매우 유용하게 사용된다.
document.createElement()는 DOM에서 새로운 요소를 생성하는 메서드이다. 생성된 요소는 메모리상에 있으며, 실제 DOM에 추가되기 전까지는 웹 페이지에 표시되지 않는다. 이 메서드를 사용하여 생성된 요소를 웹 페이지에 표시하려면, 추가적으로 appendChild()나 insertBefore() 등의 메서드를 사용하여 해당 요소를 DOM에 삽입해야 한다.
let element = document.createElement(tagName);
// 새로운 <div> 요소를 생성
let newDiv = document.createElement('div');
// 생성한 <div> 요소에 텍스트 컨텐츠를 추가
newDiv.textContent = 'Hello, World!';
// 생성한 <div> 요소에 클래스를 추가
newDiv.classList.add('myClass');
// 실제 DOM에 생성한 <div> 요소를 추가
document.body.appendChild(newDiv);
이 예제에서는 새로운 <div>
요소를 생성하고, 해당 요소에 텍스트와 클래스를 추가한 후, 실제 문서의 <body>
요소의 자식으로 삽입하였다.
document.createElement() 메서드는 DOM 조작에서 기본적이면서도 매우 중요한 메서드로, 동적으로 웹 페이지의 내용을 변경하거나 추가할 때 자주 사용된다.
Element.prepend()과 Element.append()는 자바스크립트의 DOM API에 속하는 메서드로, 새로운 노드나 문자열을 기존 요소의 자식으로 추가하는 데 사용된다. 각각의 메서드는 자식 요소들 사이의 위치에 따라 추가된다.
let container = document.getElementById('container');
// 새로운 요소들 생성
let newDiv = document.createElement('div');
newDiv.textContent = 'I am a div!';
let newText = 'I am just text.';
// prepend 메서드를 사용하여 container의 첫 번째 자식 앞에 추가
container.prepend(newDiv, newText);
// append 메서드를 사용하여 container의 마지막 자식 뒤에 추가
let anotherDiv = document.createElement('div');
anotherDiv.textContent = 'I am another div!';
container.append(anotherDiv);
Element.prepend()와 Element.append()는 문자열을 직접적으로 인수로 전달할 수 있다. 이렇게 전달된 문자열은 텍스트 노드로 변환되어 추가된다.
같은 요소를 다른 위치에 추가하려고 시도하면, 해당 요소는 원래 위치에서 제거되고 새로운 위치에 추가된다. 즉, DOM 요소는 한 번에 하나의 위치에만 존재할 수 있다.
이 두 메서드는 현대 브라우저에서 잘 지원되지만, 오래된 브라우저(예: Internet Explorer)에서는 지원되지 않을 수 있다. 호환성 문제를 피하기 위해 필요한 경우 폴리필을 사용하거나 다른 메서드(예: insertBefore 또는 appendChild)를 사용하는 것이 좋다.
Element.prepend()와 Element.append() 메서드는 DOM에 동적으로 콘텐츠를 추가할 때 매우 유용하게 사용된다.
Element.remove() 메서드는 DOM의 특정 요소를 제거하는 데 사용된다. 이 메서드를 호출하면 해당 요소와 그 자식 요소들 모두 DOM에서 제거된다.
요소에 remove() 메서드를 호출하면 해당 요소는 DOM에서 즉시 제거된다.
element.remove();
<div id="toBeRemoved">Hello, I will be removed soon!</div>
let element = document.getElementById('toBeRemoved');
element.remove();
// 이제 "toBeRemoved" div는 DOM에서 사라졌습니다.
Element.remove()를 호출하면 요소는 완전히 DOM에서 제거된다. 만약 나중에 다시 사용하려는 요소를 제거하기 전에 참조를 유지해야 할 수도 있다.
요소가 DOM에서 제거되더라도, 해당 요소에 대한 참조 (예: 변수)를 통해 여전히 접근하고 조작할 수 있다. 다만, 웹 페이지에서는 보이지 않을 뿐이다.
Element.remove() 메서드는 대부분의 현대 브라우저에서 지원된다. 그러나 오래된 브라우저 (예: Internet Explorer)에서는 지원되지 않을 수 있다. 호환성을 위해 필요한 경우 폴리필을 사용하거나 대체 방법을 고려해야 한다.
요약하면, Element.remove()는 특정 요소를 DOM에서 쉽게 제거하는 데 사용되는 간단하면서도 강력한 메서드이다.
Element.insertAdjacentElement() 메서드는 주어진 요소를 다른 요소의 지정된 위치에 삽입한다. 이 메서드는 특정 위치에 요소를 효과적으로 삽입할 수 있어 매우 유용하다.
targetElement.insertAdjacentElement(position, element);
<div id="target">Hello</div>
let target = document.getElementById('target');
let newElement = document.createElement('span');
newElement.textContent = ' World!';
// target 요소의 내부, 마지막 자식 뒤에 삽입
target.insertAdjacentElement('beforeend', newElement);
// 결과: <div id="target">Hello<span> World!</span></div>
Element.insertAdjacentElement()는 원본 요소를 이동시키지 않는다. 즉, 삽입될 요소가 이미 DOM에 있으면 그 위치에서 이동되어 새로운 위치에 삽입된다.
비슷한 메서드로 Element.insertAdjacentHTML()와 Element.insertAdjacentText()가 있다. 각각 HTML 문자열과 텍스트 문자열을 지정된 위치에 삽입하는 데 사용된다.
대부분의 현대 브라우저에서 잘 지원되지만, 오래된 브라우저에서는 지원되지 않을 수 있다.
Element.insertAdjacentElement() 메서드는 특정 위치에 요소를 정확하게 삽입하고자 할 때 유용하다.
Node.insertBefore() 메서드는 DOM의 특정 노드에 다른 노드를 삽입하기 위해 사용된다. 주어진 노드의 참조를 사용하여 다른 노드 앞에 새로운 노드를 삽입한다.
parentNode.insertBefore(newNode, referenceNode);
<ul id="list">
<li>Item 1</li>
<li id="referenceItem">Item 2</li>
<li>Item 3</li>
</ul>
let list = document.getElementById('list');
let referenceItem = document.getElementById('referenceItem');
let newItem = document.createElement('li');
newItem.textContent = 'New Item';
// referenceItem 앞에 newItem을 삽입
list.insertBefore(newItem, referenceItem);
이 예제의 실행 결과, 'New Item'이 'Item 2' 앞에 추가된다.
Node.insertBefore()는 노드의 정확한 위치에 새로운 노드를 삽입할 필요가 있을 때 유용하게 사용된다.
Node.contains() 메서드는 DOM에서 한 노드가 다른 노드를 포함하는지 여부를 판별하기 위해 사용된다. 특히, 주어진 노드가 다른 노드의 자손 노드인지, 또는 그 노드 자체인지를 확인하는 데 유용하다.
parentNode.contains(childNode);
반환 값
<div id="parent">
<div id="child"></div>
</div>
let parent = document.getElementById('parent');
let child = document.getElementById('child');
console.log(parent.contains(child)); // true
console.log(child.contains(parent)); // false
console.log(parent.contains(parent)); // true
Node.contains() 메서드는 특정 노드가 다른 노드의 자손 노드인지를 빠르게 확인할 때 유용하다.
이것은 이벤트 위임, 드래그 앤 드롭 구현 등 여러 상황에서 특정 요소의 관계를 판별하는 데 도움이 된다.
Node.textContent 속성은 노드와 그 모든 자손의 텍스트 콘텐츠를 설정하거나 가져오기 위해 사용된다. 이 속성을 사용하면 요소의 모든 자손 중에서 텍스트만을 고려한다. 즉, HTML 마크업이나 다른 요소들은 무시하고 텍스트 콘텐츠만을 고려한다.
let element = document.querySelector('#myElement');
console.log(element.textContent);
let element = document.querySelector('#myElement');
element.textContent = 'Hello, World!';
let element = document.querySelector('#myElement');
element.textContent = '<span>Hello, World!</span>';
// 화면에 "<span>Hello, World!</span>" 라는 문자열이 그대로 표시된다.
요약하면, Node.textContent는 노드의 텍스트 콘텐츠를 빠르게 읽고 쓰기 위한 간단하고 효율적인 방법을 제공한다.
Element.innerHTML 속성은 해당 요소의 내부 HTML 콘텐츠를 가져오거나 설정하는 데 사용된다. 이 속성을 사용하면 HTML 마크업을 직접 작성하거나 가져올 수 있다.
let element = document.querySelector('#myElement');
console.log(element.innerHTML);
let element = document.querySelector('#myElement');
element.innerHTML = '<span>Hello, World!</span>';
HTML 마크업을 포함한 문자열: innerHTML에 할당된 값이 HTML 태그를 포함하고 있다면, 해당 태그는 실제 HTML 요소로 파싱되고 DOM에 추가된다.
보안 주의: 외부에서 가져온 데이터를 innerHTML을 사용하여 직접 삽입하는 것은 위험한다. 악의적인 스크립트를 포함하고 있을 가능성이 있기 때문이다. 항상 외부에서 가져온 데이터를 삽입하기 전에 이를 적절히 검증하거나 삽입할 데이터에 대한 신뢰성을 확보해야 한다.
요약하면, Element.innerHTML 속성은 요소의 내부 HTML 콘텐츠를 직접 가져오거나 설정하는 데 사용된다. 그러나 보안 상의 문제로 외부 데이터를 직접 삽입할 때는 주의해야 한다.
Element.dataset
속성은 HTML 요소에서 data-*
형식의 사용자 정의 데이터 속성을 읽거나 수정할 수 있도록 도와준다. 이 속성을 사용하여 HTML 요소에 추가 정보를 저장하거나 특정 작업을 수행하기 위한 데이터를 태그할 수 있다.
data-*
형식의 속성을 사용하여 요소에 사용자 정의 데이터를 추가한다.<div id="myElement" data-user-id="12345" data-user-name="JohnDoe">...</div>
let element = document.querySelector('#myElement');
console.log(element.dataset.userId); // "12345"
console.log(element.dataset.userName); // "JohnDoe"
element.dataset.userId = "67890";
element.dataset.userAge = "30";
요약하면, Element.dataset 속성은 HTML 요소에 저장된 사용자 정의 데이터 속성 (data-* 형식)에 쉽게 액세스하거나 이를 수정하는 데 유용하다. 이를 통해 웹 페이지의 동작이나 표시에 필요한 추가 정보를 요소에 연결할 수 있다.
Element.tagName 속성은 해당 요소의 태그 이름을 대문자로 반환한다. 이 속성을 사용하여 DOM 요소의 유형(태그 이름)을 식별할 수 있다.
<div id="myDiv"></div>
let element = document.querySelector('#myDiv');
console.log(element.tagName); // "DIV"
tagName은 항상 대문자로 반환된다, 즉 HTML 문서에서는 DIV, SPAN 등으로 표시된다. 그러나 XML 또는 XHTML 문서에서는 원래 문서에 지정된 대로 반환될 수 있다.
tagName을 사용하여 요소의 유형을 확인할 수 있다. 예를 들어, 어떤 요소가 div인지 확인하려면 다음과 같이 할 수 있다.
if (element.tagName === 'DIV') {
console.log('This element is a div.');
}
tagName
은 읽기 전용 속성이므로 값을 설정할 수 없다.tagName
과 nodeName
속성은 요소 노드에 대해 동일한 값을 반환한다. 그러나, 두 속성은 다른 유형의 노드에 대해 다른 값을 반환할 수 있다. 요소 노드에서는 대체로 tagName
속성을 사용하는 것이 일반적이다.요약하면, Element.tagName 속성은 해당 DOM 요소의 태그 이름을 대문자로 반환하는 속성으로, 주로 요소의 유형을 확인하는 데 사용된다.
Element.id 속성은 해당 HTML 요소의 id 속성 값을 가져오거나 설정한다. 각 HTML 요소의 id는 해당 페이지 내에서 유일해야 하며, 주로 스크립트나 스타일시트에서 특정 요소를 식별하거나 참조하는 데 사용된다.
<div id="myDiv">Hello, World!</div>
let element = document.querySelector('#myDiv');
console.log(element.id); // "myDiv"
let element = document.createElement('div');
element.id = 'newDiv';
document.body.appendChild(element);
요약하면, Element.id 속성은 해당 요소의 id 속성 값을 가져오거나 설정하는 데 사용되며, 주로 JavaScript나 CSS에서 요소를 식별하거나 참조하기 위해 사용된다.
Element.className 속성은 해당 HTML 요소의 class 속성 값을 가져오거나 설정하는 데 사용된다. class 속성은 주로 스타일시트에서 스타일 규칙을 적용하거나 JavaScript에서 요소를 찾고 조작하는 데 사용된다. 하나의 요소는 여러 클래스를 가질 수 있으며, 각 클래스는 공백으로 구분된다.
<div class="container active">Hello, World!</div>
let element = document.querySelector('.container');
console.log(element.className); // "container active"
let element = document.createElement('div');
element.className = 'newContainer highlighted';
요약하면, Element.className 속성은 해당 요소의 class 속성 값을 가져오거나 설정하는 데 사용되며, 주로 스타일링 또는 요소의 조작 및 참조를 위해 사용된다.
Element.classList는 요소의 클래스 속성에 액세스하고 조작하기 위한 편리한 인터페이스를 제공하는 읽기 전용 속성이다. DOMTokenList 객체의 형태로 반환되며, 여러 메서드를 포함하고 있어 클래스 목록을 쉽게 관리할 수 있다.
element.classList.add('active', 'highlighted');
element.classList.remove('inactive', 'dimmed');
element.classList.toggle('active'); // 클래스의 존재에 따라 추가 또는 제거
element.classList.toggle('active', true); // 클래스가 반드시 존재하도록 강제
if (element.classList.contains('active')) {
// 'active' 클래스를 가진 경우의 작업
}
element.classList.replace('oldClass', 'newClass');
요약하면, Element.classList는 요소의 클래스를 관리하기 위한 강력하고 유연한 API를 제공한다. 클래스를 추가, 제거, 토글하거나 확인하는 작업을 간단하게 수행할 수 있다.
Element.style 속성은 요소의 style 속성에 직접 액세스하고 조작하기 위한 인터페이스를 제공한다. 이 속성을 사용하여 요소의 인라인 스타일을 동적으로 변경할 수 있다.
Element.style은 CSSStyleDeclaration 객체를 반환한다. 이 객체는 각 CSS 속성에 대해 개별적인 속성을 포함하고 있다.
let element = document.querySelector('div');
element.style.backgroundColor = 'red'; // 배경색을 빨간색으로 설정
element.style.width = '100px'; // 너비를 100픽셀로 설정
<style>
태그에서 정의된 스타일 값을 가져오려면 window.getComputedStyle() 메서드를 사용해야 한다.let color = element.style.backgroundColor;
element.style.backgroundColor = ''; // 배경색 스타일 제거
<div style="color: red;"></div>
와 같이 HTML 요소 내부의 style 속성에 직접 정의된 스타일만 액세스할 수 있다.<style>
태그에서 정의된 스타일도 포함한 값들을 반환한다.요약하면, Element.style 속성은 요소의 인라인 스타일을 동적으로 조회하고 조작하기 위한 방법을 제공한다.
window.getComputedStyle() 메서드는 특정 요소의 모든 CSS 속성 값에 대한 정보를 포함하는 객체를 반환한다. 이 메서드는 주로 요소에 적용된 최종적인 스타일 값을 알고자 할 때 사용되며, 이 값을 이용해 요소의 레이아웃, 디자인, 애니메이션 등을 정확하게 계산할 수 있다.
let element = document.querySelector('#myElement');
let styles = window.getComputedStyle(element);
console.log(styles.backgroundColor); // 요소의 배경색 값을 출력합니다.
읽기 전용: getComputedStyle()로 반환된 스타일 객체는 읽기 전용이다. 이 객체를 통해 스타일 값을 변경할 수 없다. 스타일을 변경하려면 element.style 프로퍼티를 사용해야 한다.
최종 스타일 값: 이 메서드는 요소에 적용된 모든 CSS 규칙과 스타일 값을 계산하여 최종적으로 적용되는 값들을 반환한다. 인라인 스타일, 외부 CSS, 그리고 <style>
태그 내의 스타일 규칙 등 모든 출처의 스타일을 포함한다.
단위: getComputedStyle()는 대부분의 CSS 속성 값에 대해 픽셀(px) 단위 또는 해당 속성에 적합한 단위를 사용하여 값을 반환한다.
카멜케이스: getComputedStyle()를 사용할 때도 CSS 속성의 이름은 JavaScript의 카멜케이스 방식으로 접근해야 한다. 예를 들어, CSS의 font-size 속성은 fontSize로 접근한다.
가상 요소 스타일: getComputedStyle()는 두 번째 인자로 가상 요소(pseudo-element)를 지정할 수 있다. 이를 통해, 예를 들어 ::before나 ::after와 같은 가상 요소의 스타일도 조회할 수 있다.
let beforeStyles = window.getComputedStyle(element, '::before');
console.log(beforeStyles.content);
요약하면, window.getComputedStyle()는 요소의 최종적으로 적용된 스타일 값을 조회하는 데 사용되는 메서드로, 모든 CSS 속성 값에 대한 상세 정보를 제공한다.
getAttribute()와 setAttribute()는 DOM 요소의 속성을 각각 조회하고 설정하는 데 사용되는 메서드이다.
예시
let anchor = document.querySelector('a');
let hrefValue = anchor.getAttribute('href'); // <a> 태그의 href 속성 값을 가져온다.
예시
let anchor = document.querySelector('a');
anchor.setAttribute('target', '_blank'); // <a> 태그의 target 속성 값을 '_blank'로 설정한다.
속성 이름의 대소문자: DOM에서 속성 이름은 대소문자를 구별하지 않는다. 그러나 일관성을 유지하기 위해 주로 소문자를 사용하는 것이 좋다.
보이지 않는 속성도 조회/설정 가능: HTML에서 보이지 않는 속성 (예: 사용자 정의 데이터 속성 등)도 getAttribute() 및 setAttribute()를 사용하여 조회 및 설정할 수 있다.
속성 vs. 프로퍼티: DOM 요소의 속성(attribute)과 프로퍼티(property)는 다를 수 있다. 특히 입력 요소의 value와 같은 일부 속성은 초기 값을 나타내는 반면, JavaScript 객체 프로퍼티는 현재 값을 나타낸다. 이러한 차이점에 주의하면서 작업하는 것이 중요하다.
요약하면, getAttribute()는 DOM 요소의 속성 값을 조회하는 데 사용되며, setAttribute()는 해당 값을 설정하는 데 사용된다. 이 두 메서드는 DOM 조작에서 중요한 역할을 한다.
hasAttribute()와 removeAttribute()는 DOM 요소의 속성을 조작하기 위한 메서드이다.
let anchor = document.querySelector('a');
if (anchor.hasAttribute('href')) {
console.log('The anchor has an href attribute.');
}
예시
let anchor = document.querySelector('a');
anchor.removeAttribute('target'); // <a> 태그의 target 속성을 제거한다.
대소문자: DOM에서 속성 이름은 대소문자를 구별하지 않는다. 그러나 일관성을 유지하기 위해 소문자를 사용하는 것이 좋다.
removeAttribute의 효과: removeAttribute() 메서드를 사용하여 속성을 제거하면, 해당 요소에서 해당 속성과 관련된 기본 동작이나 스타일링도 사라질 수 있다.
속성의 존재: hasAttribute()는 속성의 존재만 확인한다. 속성의 값이 무엇인지는 고려하지 않는다. 값을 확인하려면 getAttribute()를 사용해야 한다.
요약하면, hasAttribute()는 요소가 특정 속성을 가지고 있는지 확인하는 데 사용되며, removeAttribute()는 해당 속성을 요소에서 제거하는 데 사용된다. 이 두 메서드는 DOM 요소의 속성을 조작할 때 유용하다.