오늘은 DOM에 요소를 조회/추가/제거/업데이트하는 법을 배우고 JS에서 특정 요소에 이벤트 핸들러를 추가해 입력된 input의 값에 따라 경고 메시지를 띄우는 Form 유효성 검사를 페어와 함께 구현하였다.
HTML 문서를 화면에 표시하기 위헤 먼저 브라우저는 HTML 문서를 parsing하여 DOM을 생성한다. DOM은 HTML 문서를 객체 기반으로 구조화하여 Node Tree로 표현한 것으로 JS와 같은 프로그래밍 언어에서 조작할 수 있다. DOM은 JS에서 document
라는 전역 변수로 접근 가능하다.
document.querySelector('#some-id');
document.querySelectorAll('.some-class');
querySelector()
와 querySelectorAll()
은 Document
객체 뿐 아니라 Element
객체에서도 사용 가능한 메서드다.
querySelector(selector)
는 선택자와 일치하는 첫 번째 요소 / 없으면 null
반환
querySelectorAll(selector)
는 선택자와 일치하는 모든 엘리먼트를 나타내는 static NodeList
를 반환
NodeList
는 배열은 아니지만 forEach()
를 사용할 수 있으며 인덱스로 각각의 노드에 접근할 수도 있으며 Array.from()
을 사용해 배열로 변환할 수도 있다. 그 외에 getElementById(id)
, getElementByClassName(classname)
, getElementByTagName(tagname)
을 사용할 수 있다.
// 자식 요소/노드 선택
parent.children;
parent.childNodes;
// 부모 요소/노드 선택
child.parentElement;
child.parentNode;
children
은 자식 요소들을 담은 HTMLCollection
을 반환한다childNodes
는 자식 노드들을 담은 live NodeList
를 반환한다. parentElement
가 반환하는 것은 언제나 DOM 요소다. (부모 요소가 없는 경우 null
)parentNode
가 반환하는 것은 요소(Element
node)일 수도 있고, Document
노드나 DocumentFragment
노드일 수도 있다. (Document
와 DocumentFragment
는 절대 부모를 가질 수 없으며 parentNode
값은 언제나 null
이다)// 새로운 요소 생성
const newDiv = document.createElement('div');
// 새로운 요소에 텍스트 컨텐츠 채우기
newDiv.textContent = '새로운 div를 생성하였습니다.';
// 새로운 요소의 속성 부여하기
// newDiv.setAttribute(name, value);
newDiv.id = 'add-some-id';
newDiv.classList.add('add-some-class');
// 새로운 요소를 DOM에 추가하기
container.appendChild(newDiv); // 가장 마지막 자식 요소로 추가
append()
와 appendChild()
모두 가장 마지막 자식 요소로 새로운 노드를 추가하지만 약간의 차이점이 있다append()
: Node
뿐 아니라 DOMString
도 받을 수 있다. 리턴 값이 없다. 여러개의 노드를 추가할 수 있다.appendChild()
: Node
만 추가할 수 있다. 추가된 Node
를 리턴한다. 한개의 노드만 추가할 수 있다. 만약 이미 문서에 존재하는 노드를 추가하려 하면 해당 노드를 현재 위치에서 새로운 위치로 이동시킨다.parent.insertBefore(newNode, referenceNode)
를 사용할 수 있다.// 특정 요소 제거
targetElement.remove();
// 자식 요소 제거
parent.removeChild(child);
remove()
는 메서드를 호출한 요소를 제거한다. removeChild()
는 호출한 노드의 자식 노드들 중 특정된 자식을 제거하고 제거된 노드를 반환한다.