DOM; Document Object Model. HTML 요소를 Object처럼 조작할 수 있는 모델
<script src = "test.js"></script>
//src : URL 명시
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Document</title>
<!-- script 요소 삽입 위치 -->
<script src="myScriptFile.js"></script>
</head>
<body>
<div id="msg">Hello JavaScript!</div>
</body>
</html>
let msgElement = document.querySelector("#msg");
console.log(msgElement); // null
2) body 안쪽(이용할 HTML 요소보다 밑에 위치)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body>
<div id="msg">Hello JavaScript!</div>
<!-- script 요소 삽입 위치 -->
<script src="myScriptFile.js"></script>
</body>
</html>
let msgElement = document.querySelector("#msg");
console.log(msgElement); // <div id="msg">Hello JavaScript!</div>
결론: script 태그가 HTML 엘리먼트보다 밑에 위치해야 HTML 요소를 조작할 수 있음
console.log(document.body) // <body></body>
console.dir
: DOM을 객체 모습으로 출력<html>
<body>
<div id="nav">
<div class="logo"></div>
<div class="menu-wrapper">
<div class="menu"></div>
<div class="menu"></div>
<div class="menu"></div>
<div class="profile-photo"></div>
</div>
</div>
<div id="news-contents">
<div class="news-content-wrapper">
<div class="news-picture"></div>
<div class="news-title"></div>
<div class="news-description"></div>
</div>
</div>
<div id="footer"></div>
</body>
</html>
console.dir(document.body.children);
// [div#nav, div#news-contects, div#footer]
<html>
<body>
<div id="nav">
<div class="logo"></div>
<div class="menu-wrapper">
<div class="menu"></div>
<div class="menu"></div>
<div class="menu"></div>
<div class="profile-photo"></div>
</div>
</div>
<div id="news-contents">
<div class="news-content-wrapper">
<div class="news-picture"></div>
<div class="news-title"></div>
<div class="news-description"></div>
</div>
</div>
<div id="footer"></div>
</body>
</html>
// 자식요소 확인
console.dir(document.body.children[1]); // div#news-contents
let newsContents = document.body.children[1]
-> 변수를 이용, 더 간편하게 불러올 수 있음
//부모요소 확인
newsContents.parentNode
newsContents.parentElement
CRUD(Create, Read, Update, Delete)
document.createElement(div)
// div 엘리먼트 생성const tweetDiv = document.createElement(div)
// 변수에 할당document.body.*append(tweetDiv)
// 부모 *노드에 추가 (트리구조와 연결) 노드 : HTML DOM은 노드(node)라고 불리는 계층적 단위에 정보를 저장하고 있다.
append() : Element.append()메서드는 Node의 마지막 자식 뒤에 개체 집합 또는 문자열 개체를 삽입한다.
querySelector
: 셀렉터(HTML요소
#id
.class
)를 조회(질문)한다.document.querySelector('.a')
; querySelector
에 .a
를 첫번째 인자로 넣는다. document.querySelector('.a')
// 변수에 할당document.querySelectorAll('.a')
; querySelector
에 .a
를 첫번째 인자로 넣는다. -> 클래스 이름이 a인 HTML 엘리먼트를 모두 조회한다.querySelectorAll
로 불러온 값은 배열이 아닌 유사배열이다.document.querySelectorAll('.a')
; querySelector
에 .a
를 첫번째 인자로 넣는다. -> 클래스 이름이 a인 HTML 엘리먼트를 모두 조회한다.querySelectorAll
로 불러온 값은 배열이 아닌 유사배열이다.textContent
oneDiv.textContent = 'dev';
console.log(oneDiv) // <div>dev</div>
classList.add()
oneDiv.classList.add('tweet')
console.log(oneDiv) // <div class="tweet">dev</div>
Element.append()
const container = document.querySelector('#container')
container.append(oneDiv)
remove()
const container = document.querySelector('#container')
[Read]const tweetDiv = document.createElement('div')
[Create]container.append(tweetDiv)
[Append]tweetDiv.remove()
[Delete]document.querySelector('#container').innerHTML = '';
보안문제로 🚫const container = document.querySelector('#container');
while (container.firstChild) {
container.removeChild(container.firstChild);
}
const tweets = document.querySelectorAll('.tweet')
tweets.forEach(function(tweet){
tweet.remove();
})
// or
for (let tweet of tweets){
tweet.remove()
}
const container = document.querySelector('#container');
while (container.children.length > 1) {
container.removeChild(container.lastChild);
}
DOM vs JavaScript