본문으로 바로가기

DOM 수정

category JavaScript 2021. 7. 8. 19:01

DOM트리를 조작할 때 이론을 배우지 않고 실습으로만 익혔었는데 문서를 읽다보니 내가 놓치고 있는 부분이 많아서 정리한다

노드 삽입

여태까지 나는 자바스크립트로 동적으로 노드를 생성해서 넣을 때 다음과 같이 했다

<body>
    <div id="root">
      this is root
      </div>
</body>
    //노드 생성
    const $div = document.createElement('div');
    $div.classList.add('context');
    $div.innerText = 'Hello World';

    //노드 추가

    const $id = document.querySelector('#root');
    $id.appendChild($div);

style을 추가해서 각 노드마다 테두리를 표시하게 했다

노드를 동적으로 추가할 때는 appendChild 외에는 쓸 수 있는 메서드가 없는 줄 알았고

그래서 노드를 추가하는 상황에서는 순서를 유의해서 추가해야했다

하지만 그것은 내 무지였고 실제로는 다양한 메서드가 제공되고 있었고 appendChild는 구식 메서드였다

append

노드의 끝에 노드나 문자열을 삽입한다

appendChild와 동일하게 쓰이는 메서드

    const $div = document.createElement('div');
    $div.classList.add('context');
    $div.innerText = 'Hello World';

    const $id = document.querySelector('#root');
    $id.append($div);

이 코드의 결과는 위 그림과 동일하다

문자열로 추가할 때 유의해야할 점이 있는데

    const $id = document.querySelector('#root');
    $id.append('Hello World');

나는 이 코드가 위의 코드와 동일하게 작동할 줄 알았다

하지만 '끝에 추가하는 것'이기 때문에 root 하위에 Hello World가 추가되는 것이 아니라

root노드의 마지막에 'Hello World' 문자열이 삽입된다

복수 삽입

여러 개의 노드, 문자열을 동시에 삽입할 수도 있다

    const $div = document.createElement('div');
    $div.classList.add('context');
    $div.innerText = 'Hello World';
    const $div1 = document.createElement('div');
    $div1.classList.add('context');
    $div1.innerText = 'Hello World2';

    const $id = document.querySelector('#root');
    $id.append($div, $div1, 'end');

그 외의 삽입 메서드

append가 복수 삽입과 문자열 삽입을 지원하지만 순서는 appendChild와 다를 바가 없다

다음과 같은 메서드를 적절히 섞어 사용해주자

  • prepend(노드 or 문자열) – 노드나 문자열을 node 맨 앞에 삽입
  • before(노드 or 문자열) –- 노드나 문자열을 node 이전에 삽입
  • after(노드 or 문자열) –- 노드나 문자열을 node 다음에 삽입
  • replaceWith(노드 or 문자열) –- node를 새로운 노드나 문자열로 대체

HTML 삽입하기

$id.append('Hello World')를 통해 문자열을 삽입해봤는데 innerHTML 같이 태그가 포함된 문자열도 삽입이 될까?

    const $id = document.querySelector('#root');
    $id.append('<div>end</div>');

태그도 문자열로 포함되어 삽입되는 모습을 볼 수 있다

이 경우에는 다른 메서드를 사용해주어야한다

insertAdjacentHTML

노드.insertAdjacentHTML(위치, HTML)을 사용하면 HTML을 바로 삽입해 줄 수 있다

    const $id = document.querySelector('#root');
    $id.insertAdjacentHTML("beforeend", '<div>end</div>');

이 메서드의 위치 파라미터는 조금 헷갈릴 수 있으니 유의하자

위치

  • 'beforebegin' – 노드 바로 앞에 html을 삽입
  • 'afterbegin' – 노드 첫 번째 자식 요소 바로 앞에 html을 삽입
  • 'beforeend' – 노드 마지막 자식 요소 바로 다음에 html을 삽입
  • 'afterend' – 노드 바로 다음에 html을 삽입

https://ko.javascript.info/modifying-document#ref-169

 

'JavaScript' 카테고리의 다른 글

defer, async 스크립트  (0) 2021.07.12
주요 노드 프로퍼티  (0) 2021.07.09
modal에 keydown 이벤트 추가하기 (tabindex)  (0) 2021.06.02
parentElement vs parentNode  (0) 2021.05.25
Element.closest()  (0) 2021.05.24