본문 바로가기

개념정리

8/11[TIL] DOM

DOM(Document Object Model)은 HTML에 접근하여 JS의 객체처럼 HTML을 조작할 수 있는 모델이며 DOM의 구조를 조회하기 위해서는 'console.dir(DOM을 객체의 모습으로 보여주는 것)' 이 유용하다.

[Document는 DOM을 대표하는 객체로 console.dir 에서 확인 할 수 있다]

 

document 객체를 통해서 HTML 엘리먼트를 만들고(CREATE), 조회하고(READ), 갱신하고(UPDATE), 삭제하는(DELETE) 하는 방법을 알아야 하고 또한, HTML에 적용(APPEND)하는 메소드도 존재한다.

DOM을 JavaScript로 조작하여 HTML Element를 추가하거나 삭제, 혹은 내용을 변경할 수 있다.

 

1. createElement - CREATE 

1
const tweetDiv = document.createElement('div')
cs

(div element를 만든상태에 tweetDiv 변수를 선언)

 

2. APPEND - append, appendChild

1
document.body.append(tweetDiv)
cs

(DOM구조와 연결 되지 못한 div element를 HTML에 추가 적용)

 

- prepend : 선택한 요소의 자식 요소 앞에 내용 삽입

- append : 선택한 요소의 자식 요소 뒤에 내용 삽입

- appendChild는 DOM 함수이고
- append는 JavaScript 함수

 

 

3. querySelector, querySelectorAll - READ

1
2
const oneTweet = document.querySelector('.tweet')
const tweets = document.querySelectorAll('.tweet')
cs

(tweet를 클래스 이름으로 가진 모든 HTML 엘리먼트 조회 가능 All이 붙고 안 붙고는 하나만 가져오는지 다 가져오는지의 여부에 따른다.)

Document.querySelector()는 제공한 선택자 또는 선택자 뭉치와 일치하는 문서 내 첫 번째 엘리먼트를 반환한다. 일치하는 요소가 없으면 null을 반환하게 된다.

 

4. textContent, id, classList, setAttribute - UPDATE

1
2
3
4
5
6
oneDiv.textContent = 'dev';
console.log(oneDiv) // <div>dev</div>
 
 
oneDiv.classList.add('tweet')
console.log(oneDiv) // <div class="tweet">dev</div>
cs

(class를 지정 후, append로 container에 붙이기)

 

5.remove, removeChild, innerHTML = "" , textContent = "" - DELETE

1
2
3
4
const container = document.querySelector('#container')
const tweetDiv = document.createElement('div')
container.append(tweetDiv)
tweetDiv.remove() // 이렇게 append 했던 엘리먼트를 삭제할 수 있다.
cs

(자식 엘리먼트를 지우는 방법 중에 가장 간단한 방법은 innerHTMLinnerHTML을 활용하는 방법이지만, innerHTML은 여러 보 안상의 문제를 가지게 되어 비추천된다고 한다.)

removeChild는

1
2
3
4
const container = document.querySelector('#container');
while (container.firstChild) {
  container.removeChild(container.firstChild);
}
cs

while 조건문을 이용하여 원하는 부분만큼 삭제할 수 있으며, 아래처럼 직접 일일이 엘리먼트 자체를 찾아서 지울 수도 있다고 한다.

1
2
3
4
5
6
7
8
const tweets = document.querySelectorAll('.tweet')
tweets.forEach(function(tweet){
    tweet.remove();
})
// or
for (let tweet of tweets){
    tweet.remove()
}
cs

 

* innerHTML과 textContent의 차이

  두 가지 모두 값을 할당할 수 있는 특성(화면의 표시내용이 바뀜)이라 되도록이면, textContent를 사용하는 것이 좋은 것 같다. 성능과 보안에 강점이 있으며 결과적으로 해당 노드의 raw text를 얻게 됨으로써 이후 의도한 대로 가공할 수 있기 때문이다. ex)<a href = "https://www.naver.com">네이버</a>   => 네이버만 표기

 

 

innerHTML

  HTML Parsing이 필요한 문자열에만 사용하도록 하는 게 좋으며 그게 아니라면, 성능상 좋지 않고 XSS 공격에도 취약하므로 innerHTML은 사용하지 않는 것이 좋다고 한다. 

ex)<a href = "https://www.naver.com">네이버</a> => 해당 태그 전체 모두 표기

 

'개념정리' 카테고리의 다른 글

8/18[TIL] underbar 과제  (0) 2020.08.18
8/14[TIL] 고차함수  (0) 2020.08.14
8/10[TIL] CSS  (0) 2020.08.10
[8/10]TIL <HTML>  (0) 2020.08.10
개발자로의 커리어 전환 2주일...  (1) 2020.08.10