document객체를 이용하여 HTML 문서를 조작할 수 있다.console.dir();
() 안에 document를 넣으면 object의 모습으로 보여준다.
자식 엘리먼트 조회
document.body.children
document.body.parentElement
document 객체를 통해서 HTML 엘리먼트를 만들고(CREATE), 조회하고(READ), 갱신하고(UPDATE), 삭제하는(DELETE) 하는 방법을 알아보자.
const tweetDiv = document.createElement('div')
document.body.append(tweetDiv)
// Inserting a Node object
const parent = document.createElement('div');
const child = document.createElement('p');
parent.append(child);
// This appends the child element to the div element
// The div would then look like this <div><p></p></div>
// Inserting a DOMString
const parent = document.createElement('div');
parent.append('Appending Text');
// The div would then look like this <div>Appending Text</div>
// Inserting a Node object
const parent = document.createElement('div');
const child = document.createElement('p');
parent.appendChild(child);
// This appends the child element to the div element
// The div would then look like this <div><p></p></div>
// Inserting a DOMString
const parent = document.createElement('div');
parent.appendChild('Appending Text');
// Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'
| 차이점 | append | appendChild |
|---|---|---|
| 타입 | JavaScript 메서드 | DOM 메서드 |
| 반환 값 | undefined | Node object |
| 여러 요소 추가 가능 | 하나만 노드 객체 추가 가능 | |
| DOMStirng과 Node object 추가 가능 | Node object만 추가 가능 |
// .append에서 DOMStirng과 Node object 추가 가능하지만 .appendChild는 Node object만 가능
const parent = document.createElement('div');
const child = document.createElement('p');
// Appending Node Objects
parent.append(child) // Works fine
parent.appendChild(child) // Works fine
// Appending DOMStrings
parent.append('Hello world') // Works fine
parent.appendChild('Hello world') // Throws error
//.append()는 여러 요소 추가 가능하지만 .appendChild()는 하나의 Node object만 가능
const parent = document.createElement('div');
const child = document.createElement('p');
const childTwo = document.createElement('p');
parent.append(child, childTwo, 'Hello world'); // Works fine
parent.appendChild(child, childTwo, 'Hello world');
// Works fine, but adds the first element and ignores the rest
// .append()는 반환값이 없고 .appendChild()는 반환값이 Node object이다.
const parent = document.createElement('div');
const child = document.createElement('p');
const appendValue = parent.append(child);
console.log(appendValue) // undefined
const appendChildValue = parent.appendChild(child);
console.log(appendChildValue) // <p><p>
prepend : One or more nodes to insert before the first child node currently in the ParentNode.
<div class="a">
<span></span>
</div>
<div class="b"></div>
const span = document.querySelector(‘span’);
const divB = document.querySelector(‘.b’);
divB.appendChild(span);
<div>HTML Document</div>
<div id = 'div'>HTML Document</div>
<div id = 'div2'>
<span class = 'span'>HTML Document</span>
</div>
document.querySelector('div');
//결과 : div
document.querySelector('#div');
//결과 : <div id = 'div'>HTML Document</div>
let div = document.querySelector('#div2');
div.querySelector('.span');
//결과 : <span class = 'span'>HTML Document</span>
const oneDiv = document.createElement('div') // 요소 생성
console.log(oneDiv) // <div></div>
oneDiv.textContent = 'dev'; // 내용 삽입
console.log(oneDiv) // <div>dev</div>
oneDiv.classList.add('tweet') // class 속성 추가
console.log(oneDiv) // <div class="tweet">dev</div>
const container = document.querySelector('#container') // 부모 엘리먼트
container.append(oneDiv) //append로 요소 추가
<html>
<head>
<title>
안녕~
</title>
</head>
<body>
<div class='divTest'>
<!-- 내용 시작 -->
<p class='pTest'>은하수를 여행하는 히치하이커를 위한 안내서</p>
<p class='pTest'>오리엔트 특급살인</p>
</div>
</body>
</html>
document.querySelector('div').classList
//결과 : DOMTokenList ["divTest", value: "divTest"]
let div = document.querySelector('div').classList
//결과 : <div class="divTest"> ... </div>
div.classList.remove('divTest');
//결과 : <div class> ... </div>
div.classList.add('anotherclass')
// 결과 : <div class='anotherclass'> ... </div>
div.classList.toggle('visible');
//결과 <div class=""anotherclass visible"> ... </div>
div.classList.toggle('visible', false);
//결과 <div class="anotherclass"> ... </div>
div.classList.toggle('visible', true);
//결과 <div class="anotherclass visible"> ... </div>
div.classList.contains('new')
//결과 false
//replace 후는 true
div.classList.replace('anotherclass','new');
// 결과 <div class="new"> ... </div>
oneDiv.setAttribute("id","test"); //id="test" 속성을 추가
innerHTML : 태그와 내용 전부다 가져온다. 태그를 넣을 수 있다.
<p id = 'p'><h1 style="color:blue">innerHTML</h1></p>
let p = document.querySelector('#p');
p.innerHTML // <h1 style="color:blue">innerHTML</h1>
textContent : 띄어쓰기와 내용들 전부 가져온다. 값을 재할당 가능하다.
<p id="p"><h1 >textContent</h1></p>
// textContent
아래 예시에서는 "foo"라는 id를 가진 요소를 찾고 "foo" 요소에게 자식노드가 있으면 첫번째 자식노드를 제거해줍니다.
let foo = document.getElementById("foo");
if ( foo.hasChildNodes() ) {
foo.removeChild( foo.childNodes[0] );
}
<div>
<!-- 내용 시작 -->
<p>은하수를 여행하는 히치하이커를 위한 안내서</p>
<p>오리엔트 특급살인</p>
</div>
document.querySelector("div").childNodes
// 결과 NodeList(7) [text,comment, text, p, text, p, text]
div 시작 후 엔터가 배열 0번째 요소인 text
내용 시작이 comment
내용 시작 다음 엔터가 text
p는 p 은하수를 여행하는 히치하이커를 위한 안내서
다음 text는 엔터
p는 p 오리엔트 특급살인
다음 text는 엔터
결국,childNodes는
<!-- 내용 시작 -->
<p>은하수를 여행하는 히치하이커를 위한 안내서</p>
<p>오리엔트 특급살인</p>
이다.
<div>
<!-- 내용 시작 -->
<p>은하수를 여행하는 히치하이커를 위한 안내서</p>
<p>오리엔트 특급살인</p>
</div>
document.querySelector("div").children
// 결과 HTMLCollection(2) [p, p]
![]() |
|---|
const body = document.querySelector('body')
const div = document.createElement('div')
body.append(div)
div.remove()
const body = document.querySelector('body')
body.innerHTML='' // 자식 엘리먼트 전부 삭제
const body = document.querySelector('body');
while (body.firstChild) {
body.removeChild(container.firstChild);
}
//p 요소를 body에 javascript를 이용해서 추가해 보기
<body>
<p>요소 하나 추가</p>
</body>
let button = document.querySelector('#button'); // 클릭 이벤트할 요소 가져오기
function buttonInput() { // 요소를 추가하는 함수
let p = document.createElement('p');
p.textContent="요소 하나 추가";
let parent = document.querySelector("body");
parent.appendChild(p);*-
}
button.addEventListener('click',buttonInput); //클릭 이벤트 발생 시 이벤트 핸들러 사용
button.onclick = buttonInpu;
엘레먼트 객체
|속성 이름|속성|
|:---:|:---:|
|tagName | 태그 이름|
|id | id값|
|classList | class 목록|
|className | class 문자열|
|value | form 입력값|
|children|자식 엘리먼트|
|parentElement|부모 엘리먼트|
|childNodes|자식 노드|
|dataset|실제 데이터는 아니지만 속성에 담아있는 값|
|onclick|클릭 이벤트|
/* this가 number형인 값을 불러와 함수 작성 가능 */
Number.prototype.[메서드 이름] = function() {
//...함수 실행할 명령어들
}
<template id='a'>
<span>after</span>
</template>
<div id='b'>before</div>
let b = document.querySelector('#b');
let template = document.querySelector('#a');
let newContent = document.importNode(template.content,true);
// 자식 노드 전부 포함하여 복사
b.textContent = '';
b.appendChild(newContent); //<div id='b'>after</div>
DOM 너~무 어렵다 ㅠㅠ