<html>
요소 하나.<html>
요소의 자식 노드에는 <head>
와 <body>
가 존재.parentNode
와 childNodes
프로퍼티가 있고,nodeName
과 nodeType
(타입을 정수로 표현)프로퍼티가 있음.<p>
태그는 HTML 요소지만, 문단에 포함된 텍스트는 텍스트 노드.<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Simple HTML</title>
<style>
.callout {
border: solid 1px #ff0080;
margin: 2px 4px;
padding: 2px 6px;
}
.code {
background: #ccc;
margin: 1px 2px;
padding: 1px 4px;
font-family: monospace;
}
</style>
<link rel="stylesheet" href="./style.css" />
</head>
<body>
<header>
<h1>Simple HTML</h1>
</header>
<div id="content">
<p>This is a <i>simple</i> HTML file.</p>
<div class="callout">
<p>This is as fancy as we'll get!</p>
</div>
<p>
IDs (such as <span class="code">#content</span>) are unique (there can
only be one per page).
</p>
<p>
Classes (such as <span class="code">.callout</span>) can be used on may
elements.
</p>
<div id="callout2" class="fancy">
<p>A single HTML element can have multiple classes.</p>
</div>
</div>
<script src="./index.js"></script>
</body>
</html>
get
메서드 이용HTMLCollection
의 인스턴스 반환.[0]
(인덱스) 사용.document.getElementById
console.log(document.getElementById('content')); // HTML에서 ID가 'content'인 요소를 찾아 콘솔에 출력.
// <div id="content">...</div> 출력.
document.getElementByClassName
console.log(document.getElementsByClassName('callout'));
// HTMLCollection[div.callout] 출력.
document.getElementByTagName
console.log(document.getElementsByTagName('p'));
// HTMLCollection[p, p, p, p, p] 출력.
query
메서드 이용div
.
을 적음. .callout
#
을 적음. #content
#content p // ID가 content인 요소의 자손인 <p>요소 선택
>
기호를 넣으면 자손이 아닌 자식만 선택. #content>p // content요소의 자식인 <p>요소 선택
querySelector
null
.document.querySelector(".code"); // <span class="code">#content</span> 출력.
queryselectorAll
NodeList
반환.[0]
(인덱스) 사용.document.querySelectorAll(".code");
// NodeList(2) [span.code, span.code]
HTMLCollection
과 NodeList
get
메서드에서 반환하는 HTMLCollection
.queryselectorAll
에서 반환하는 NodeList
.[i]
인덱스 등)console.log([...document.getElementsByTagName('p')]);
// [p, p, p, p, p] 출력.
HTMLCollection
<!DOCTYPE html>
<html lang="en">
<head>
<style>
.red {
font-weight: bold;
color: red;
}
.blue {
font-weight: lighter;
color: blue;
}
</style>
</head>
<body>
<div class="red">빈지노</div>
<div class="red">검정치마</div>
<div class="red">이센스</div>
<div class="red">스윙스</div>
<div class="red">오웬</div>
<script>
const artists = document.getElementsByClassName('red');
for (let i = 0; i < artists.length; i++) {
artists[i].className = 'blue';
}
</script>
</body>
</html>
-실행결과는 다음과 같음.
for
문에서 빈지노 요소([0]
) 의 class
가 blue
로 변하는 순간 Live DOM Collection 객체가 요소가 변한 것을 바로 반영하여, 다음 값인 검정치마([1]
)의 인덱스가 [0]
으로 바뀜.NodeList
에서는 이런 현상이 발생하지 않음.HTMLCollection
즉, get
메서드의 속도가 더 빠름.HTMLCollection
은 Array.
메서드가 사용 불가. (.map()
, .forEach()
등)NodeList
NodeList
는 .forEach()
는 사용 가능 하지만 .map()
, .filter()
는 이용 불가.textContent
와 innerHTML
프로퍼티가 존재.textContent
const para1 = document.getElementsByTagName('p')[0];
para1.textContent; // 'This is a simple HTML file.'
para1.textContent = 'Modified HTML file';
innerHTML
const para1 = document.getElementsByTagName('p')[0];
para1.innerHTML; // 'This is a <i>simple</i> HTML file.'
para1.innerHTML = 'Modified HTML file';
create
const p1 = document.createElement('p'); // p태그 생성
const p2 = document.createElement('p'); // p태그 생성
p1.textContent = '새 요소 생성1';
p2.textContent = '새 요소 생성2!';
insertBerore
insertBefore(삽입할 요소, 삽입할 위치);
const p1 = document.createElement('p');
p1.textContent = '새 요소 생성1';
const parent = document.getElementById('content'); // 추가하려는 위치의 부모노드.
const firstChild = parent.childNodes[0]; // 추가하려는 첫번째 위치.
parent.insertBefore(p1, firstChild); // p1을 parent의 firstChild위치에 추가.
appendChild
const p2 = document.createElement('p');
p2.textContent = '새 요소 생성2!';
const parent = document.getElementById('content'); // 추가하려는 위치의 부모노드.
parent.appendChild(p2); // p2를 parent의 마지막 위치에 추가.
/* 먼저 CSS에서 클래스를 만들어야 함. */
.highlight {
background: #ff0;
font-style: italic;
}
classList
프로퍼티 존재.classList
프로퍼티의 add
메서드로 클래스를 추가할 수 있음.// 매개변수로 받은 단어가 있는 문단(p)에 하이라이트 하는 함수.
function highlightParas(containing) {
if (typeof containing === 'string')
containing = new RegExp(`\\b${containing}\\b`, 'i');
const paras = document.getElementsByTagName('p');
console.log(paras);
for (let p of paras) {
if (!containing.test(p.textContent)) continue;
p.classList.add('highlight'); // 클래스를 추가할 때는 classList.add 이용.
}
}
highlightParas('unique'); // unique가 있는 문단에 하이라이트.
classList
프로퍼티의 remove
사용.// highlight 클래스를 지우는 함수.
function removeParaHighlights() {
const paras = document.querySelectorAll('p.highlight');
for (let p of paras) {
p.classList.remove('highlight'); // 클래스를 제거할 때는 classList.remove 이용.
}
}
data-
로 시작하는 속성. (하이픈 뒤의 속성 이름은 모두 가능)<!-- 2개의 버튼에 highlightParas와 removeParaHighlights 함수를 연결 하기. -->
<!-- button 요소에 data 속성 추가. -->
<button data-action="highlight" data-containning="unique">
Highlight paragraphs containing "unique"
</button>
<button data-action="removeHighlights">
Remove highlights
</button>
// 새로운 CSS선택자가 나옴. 대괄호 문법은 어떤 속성이든 찾을 수 있음. 데이터 속성은 대괄호 문법.
const highlightActions = document.querySelectorAll('[data-action="highlight"]');
highlightActions[0].dataset; // DOMStringMap {action: 'highlight', containning: 'uniqe'}; (data set 프로퍼티가 생김.)
addEventListener
메서드가 존재 하고, 이벤트 발생시 호출할 함수 지정 가능.// button 2개를 함수와 연결.
// 새로운 CSS선택자가 나옴. 대괄호 문법은 어떤 속성이든 찾을 수 있음. 데이터 속성은 대괄호 문법.
const highlightActions = document.querySelectorAll('[data-action="highlight"]');
for (let a of highlightActions) {
a.addEventListener('click', (evt) => {
evt.preventDefault();
highlightParas(a.dataset.containing); // highlightParas 함수에 data 속성의 containing요소를 삽입.
});
}
const removeHighlightsAction = document.querySelectorAll(
'[data-action="removeHighlights"]'
);
for (let a of removeHighlightsAction) {
a.addEventListener('click', (evt) => {
evt.preventDefault();
removeParaHighlights(); // removeParaHighlights 실행.
});
}