우리는 요소 안에 무언가를 집어넣을때 textContent, innerText, innerHTML을 종종 쓰곤 한다. 그런데 나는 세 개의 차이점을 잘 알지 못하고 썼다. 이번 기회로 보면서 정리하고 넘어가자.
const hello = document.querySelector('.hello');
hello.textContent = '<h1>Hello</h1>';
// 출력결과
// <h1>Hello</h1>
💡 그래서 단순히 문자열을 설정하고 읽어올때는 textContent를 쓰는 것이 좋다. 하지만, 만약 최상위의 부모컨테이너에서 textContent를 설정하는 순간, 그 안에 들어있는 모든 자식 요소들의 노드들이 삭제되니까 제일 말단의 텍스트나 인풋같은 요소들에게 쓰는 것이 좋다.
✏️ innerHTML 번외
ex)
<script>
const section = document.querySelector('section');
const h2 = document.createElement('h2');
h2.setAttribute('class','title');
h2.textContent = 'This is a title';
const h3 = document.querySelector('h3');
section.insertBefore(h2, h3);
</script>
이렇게 코드를 작성하면 section태그 안에 class가 title이고 'This is a title'인 h2태그가 생성되고 h3태그 앞에 h2가 위치하게 된다.
(참고로 appendChild는 뒤에 추가 / insertBefore은 뒤에 입력하는 것 앞에 삽입되도록 추가)
또 다른 방법으로는
section.innerHTML = `
<img src='img/avatar.png' alt='avatar'>
<h1 class='introduction'>Name</h1>
<h2 class='title>This is a title</h2>
<h3 class='subtitle'>This is a subtitle</h3>
`
이렇게도 추가할 수 있다. 그럼 둘의 차이는 무엇일까?
h2의 텍스트를 계속 변경해야하거나 추가해야하는 사항이 있다면 후자의 방법보다는 전자의 방법을 사용하는 것이 좋다. 왜냐하면 h2의 변경사항이 있을때마다 section 안의 내용 전체가 바뀌어야 하기 때문이다. 계속 DOM Tree가 만들어지고, Rander Tree돌 만들어져야 하므로 브라우저의 성능에 좋지 않다. 그러므로 요소의 변수를 가지고 있으면서 많은 동작을 해야한다면 전자의 방법을 쓰고, 한번 업데이트 하고 변경할 일이 없으면 후자의 방법을 쓰자.
출처
드림코딩아카데미 브라우저 101