👇 활용할 코드
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>DOM</title>
</head>
<body>
<div id="content">
<h2 class="title">A</h2>
<ul id="list-1">
<li>A-1</li>
<li>A-2</li>
<li>A-3</li>
<li>A-4</li>
</ul>
<h2 class="title">B</h2>
<ul id="list-2">
<li>B-1</li>
<li>B-2</li>
<li>B-3</li>
</ul>
</div>
<script src="index.js"></script>
</body>
</html>
Javascript로 위 HTML에 접근하려면 어떻게 해야 할까?
접근할 수 있는 방법은 여러가지가 있다. 하나씩 살펴보자.
➡️ html의 id
속성을 이용하여 해당 id
를 가진 태그를 반환한다.
선택된 태그 안에 다른 태그가 있다면 함께 선택된다.
💡 id
는 고유한 값이기 때문에 하나의 태그를 선택할 때 유용하다.
const myId = document.getElementById('list-1');
console.log(myId);
➡️ html의 class
속성을 이용하여 해당 class
에 속한 태그 전체를 반환
💡 id
와는 다르게, 여러 요소들을 동시에 선택해야 할 때 유용하다.
❗ 여러 요소들을 선택하는 것이니 getElement
에 s가 붙는다!
const myClass = document.getElementsByClassName('title');
console.log(myClass);
위를 보면 HTMLCollection
으로 반환되는 걸 볼 수 있다.
배열과 모양은 같지만, 완벽히 배열은 아닌 이런 형태를 유사 배열이라고 부른다!
💡 유사 배열 (Array-Like Object)
배열과 유사한 객체이다. 몇 가지 특징을 가지고 있다.
- 숫자 형태의
indexing
이 가능하다.- 길이를 나타내는
length
프로퍼티가 있다.- 배열의 기본 메소드를 사용할 수 없다 (ex.
push
,splice
등).Array.isArray(유사배열)
=false
이다. 즉, 배열이 아니다.
➡️ html의 tag
를 이용하여 해당 tag
를 가진 태그들을 반환
❗ 명확한 의도가 없이 많은 요소들을 한꺼번에 다루게 되면 예상치 못한 실수를 할 가능성이 있기 때문에 많이 사용되는 메소드는 아니므로 알아만 두자.
const myTag = document.getElementsByTagName('h2');
console.log(myTag);
➡️ css의 선택자를 이용하여 한 개의 태그만 선택
💡 해당 선택자를 가진 태그 중 가장 첫 번째 태그만 반환한다.
const mySelector = document.querySelector(".title");
console.log(mySelector);
➡️ css의 선택자를 이용하여 여러 개의 태그를 선택
💡 해당 선택자를 가진 태그들을 NodeList
로 반환한다.
const mySelector = document.querySelectorAll(".title");
console.log(mySelector);
원하는 요소 노드가 감싸고 있는 내부의 html 코드를
➡️ 문자열(줄바꿈 및 들여쓰기 포함)로 반환한다.
=
으로 값을 할당하여 기존 값을 새로운 값으로 완전히 교체+=
로 값을 추가할 수도 있다.const myTag = document.querySelector('#list-1');
console.log(myTag.innerHTML);
원하는 요소 노드를 포함한 내부의 html 코드를
➡️ 문자열(줄바꿈 및 들여쓰기 포함)로 반환한다.
앞서 innerHTML
과 비슷하지만, outerHTML
은 노드를 포함한 코드를 반환한다.
const myTag = document.querySelector('#list-1');
console.log(myTag.outerHTML);
❗ outerHTML은 =
를 통해 프로퍼티를 수정하게 되면 완전히 새로운 요소가 되어서 그 이후에 그 요소를 다루려면 새롭게 요소를 찾아야한다.
const myTag = document.querySelector('#list-1');
myTag.outerHTML = '<ul id="new list"> </ul>' // outerHTML 수정 -> myTag와 다른 요소가 됨
const newTag = document.querySelector('#list-1') // 새 변수에 할당하여 사용
원하는 요소 노드 내부의 코드를
➡️ html 태그를 제외한 문자열(줄바꿈 및 들여쓰기 포함)로 반환한다.
innerHTML
과 outerHTML
과 다른 점은 태그를 제외한 텍스트만 반환하는다는 점이다.
const myTag = document.querySelector('#list-1');
console.log(myTag.textContent);
세 프로퍼티가 뭐가 다른지는 알겠는데, 어떻게 사용해야 할지 잘 모르겠다.
그래서, A 리스트에 요소를 하나 추가하는 동작을 수행해보기로 했다.
const myTag = document.querySelector('#list-1')
myTag.innerHTML += '<li> new </li>'
💡 A 리스트의 요소에 new가 새로 추가된 걸 볼 수 있다.
const myTag = document.querySelector('#list-1')
myTag.outerHTML += '<li> new </li>'
💡 A 리스트 밖에 new 가 추가된 걸 볼 수 있다.
const myTag = document.querySelector('#list-1')
myTag.textContent += '<li> new </li>'
❗ textContent는 단순 텍스트만 다루기 때문에, 새 요소를 추가하면 노드 안의 기존 태그들이 모두 사라진 채, 기존 텍스트에 새 텍스트가 추가된 채로 저장된다.
❗ 태그를 입력해도 그냥 특수문자 ('<' =꺽쇠)로 인식하기 때문에, <li>
도 텍스트로 추가됨
앞서 알아본 방법으로 요소 노드를 추가 / 삭제 하는 방법을 알아보자.
+
로 추가할 수도 있지만, 기존의 문서 구조를 덮어쓰게 되므로
요소 노드를 직접 생성해서 추가하는 방법을 사용하는 것이 좋다.
document.createElement('태그이름')
를 사용하여
원하는 태그 이름으로 요소 노드를 만들 수 있다.
textContent
, innerHTML
, ...
텍스트만 사용한다면 textContent
를, 태그도 사용한다면 innerHTML
을 사용하면 되겠다.
Node.prepend
: Node의 처음 자식 노드로 추가Node.append
: Node의 마지막 자식 노드로 추가Node.before
: Node의 앞쪽에 형제 노드로 추가Node.after
: Node의 뒤쪽에 형제 노드로 추가파라미터로 여러 값을 전달하면 전달한 순서대로 한번에 추가할 수 있다.
const MyTag = document.querySelector('#list-1')
const first = document.createElement('li') // 요소 노드 만들기
first.textContent = '처음' // 요소 노드 꾸미기
MyTag.prepend(first) // 요소 노드 추가하기
const last = document.createElement('li') // 요소 노드 만들기
last.textContent = '마지막' // 요소 노드 꾸미기
MyTag.append(last) // 요소 노드 추가하기
const prev = document.createElement('p') // 요소 노드 만들기
prev.textContent = '이전' // 요소 노드 꾸미기
MyTag.before(prev) // 요소 노드 추가하기
const next = document.createElement('p') // 요소 노드 만들기
next.textContent = '다음' // 요소 노드 꾸미기
MyTag.after(next) // 요소 노드 추가하기
Node.remove()
로 Node를 삭제할 수 있다.
만약 Node의 자식 노드를 삭제하고 싶으면 Node.children.remove()
n번째 자식 노드를 삭제하고 싶다면 Node.children[n].remove()
위에서 A-3
을 삭제하고 싶다면, A-3
은 4번째 자식 요소이므로
MyTag.children[3].remove()
로 삭제할 수 있겠다.
위에서 A-2
를 맨 뒤로 이동시키고 싶다면 .append
를 이용하여
MyTag.append(MyTag.children[2])
로 이동할 수 있다.