DOM 조작
- 새로운 노드를 생성하여 DOM에 추가, 혹은 기존 노드 삭제 또는 교체 하는 것으로, 리플로우와 리페인트가 발생한다.
innerHTML
- 프로퍼티는 setter와 getter 모두 존재하는 프로퍼티로 HTML 문자열을 반환.
- 크로스 사이트 스크립팅(XSS) 공격에 취약하다. 때문에 HTML5를 지원하는 브라우저에서는 동작하지 않는다.
- 요소를 모두 제거하고 생성하기 때문에 효율적이지 못하다.
insertAdjacentHTML
- innerHTML과 달리 기존 요소를 제거하지 않고 위치를 지정해 새로운 요소를 삽입한다.
- 첫번 째 인수로 전달할 수 있는 문자열은 아래 네가지다.
- const $foo = doucument.getElementById("foo") $foo.insertAdjacentHTMl("beforebegin",'<p>text</p>') $foo.insertAdjacentHTMl("afterbegin",'<p>text</p>') $foo.insertAdjacentHTMl("beforeend",'<p>text</p>') $foo.insertAdjacentHTMl("afterend",'<p>text</p>')
- innerHTML과 같이 크로스 사이트 스크립팅 공격에 취약하다.
노드 생성과 추가
- createElement. 요소 노드 생성
- createTextNode. 텍스트 노드 생성
- appendChild. 텍스트 노드를 요소 노드에 자식 노드로 추가
- appendChild. 요소 노드를 DOM에 추가.
const $foo = doucument.getElementById("foo")
const $element = document.createElement("li")
const $text = document.createTextNode('안녕하세요')
$element.appendChild($text)
$foo.appendChild($element)
- 복수의 노드 생성과 추가
- appendChilde를 이용하여 DOM에 요소노드를 추가하면, 리플로우와 리페인트가 실행된다. 따라서 여러개의 노드를 생성하고 추가하고 싶다면 컨테이너 요소를 넣어서 리플로우와 리페인트를 한 번만 실행하도록 한다.
const $container = document.createElement(`div`) ['A','B','C'].forEach(text => { const $li = document.createElement("li") const $text = document.createTextNode(text) $li.appendChild($text) $container .appendChild($li) })
- 위 예제처럼 사용한다면 불필요한 div 요소가 생성된다. 따라서 DocumentFragment 노드를 사용한다. DocumentFragment 노드는 DOM에 추가될 때 자신은 제거되고 자식 노드만 DOM에 추가된다.
const $container = document.createDocumentFragment() ['A','B','C'].forEach(text => { const $li = document.createElement("li") const $text = document.createTextNode(text) $li.appendChild($text) $container .appendChild($li) })
- 노드 삽입
- appendChild. 마지막 자식 요소로 삽입
- insertBefore(newNode, childNode). 첫 번째 인수를 두 번째 인수 앞에 삽입. 두 번째 요소가 자식요소가 아니라면 DOMExeption 에러 발생. null이면 appendChild와 같이 동작
- 노드 이동
- 이미 DOM에 존재하는 노드에 appendChild와 insertBefore를 사용하여 다시 DOM에 추가한다면 노드가 이동한다.
- 노드 복사
- cloneNode([deep : true | false]). 노드를 복사한다. 인수의 값에 따라 깊은 복사와 얕은 복사를 할 수 있다.
- 노드 교체
- replaceChild(new, old)
- 노드 삭제
- removeChild(child)
'기술 서적 > 하루 30분 모딥다' 카테고리의 다른 글
하루 30분 모던 자바스크립트 딥 다이브. let, const 키워드 (0) | 2023.06.16 |
---|---|
하루 30분 모던 자바스크립트 딥 다이브. 전역 변수의 문제 (0) | 2023.06.14 |
하루 30분 모던 자바스크립트 딥 다이브. 스코프 (0) | 2023.06.08 |
하루 30분 모던 자바스크립트 딥 다이브. 함수 (0) | 2023.06.03 |
하루 30분 모딥다. 어트리뷰트 (0) | 2023.06.01 |