element.insertAdjacentHTML(position, htmlString)
element.insertAdjacentHTML()
메서드는 인자로 전달한 문자열(htmlString)을 HTML로 파싱해서 지정된 위치(position)에 삽입하는 메서드다. 사용자 입력을 받지 않는 곳에 사용하면 createElement()
메서드를 사용하는 것 보다 간편하게 요소를 삽입할 수 있다. 사용자 입력을 받아서 처리할 때는 XSS 공격을 방지하기 위해 별도의 sanitizing이 필요하다.
비슷한 메서드로 element.innerHTML()
이 있지만 삽입 위치를 지정할 수 없고, 기존 요소를 덮어쓰기 때문에 전체 요소를 다시 파싱해야 하는 단점이 있다. 이는 많은 데이터를 다룰 때 성능 저하를 일으킬 수 있다.
<main>
<ul>
<li>Todo 1</li>
<li>Todo 2</li>
<li>Todo 3</li>
<!-- 추가하고 싶은 위치 -->
</ul>
</main>
const $ul = document.querySelector("ul");
// 전체 <ul> 태그 다시 파싱 🙁
$ul.innerHTML += '<li>Todo 4</li>';
const $ul = document.querySelector("ul");
// 2번째 인자로 넘긴 htmlString 문자열만 파싱 😃
$ul.insertAdjacentHTML("beforeend", '<li>Todo 4</li>');
<aside> <img src="/icons/search_gray.svg" alt="/icons/search_gray.svg" width="40px" /> 원하는 위치에 엘리먼트 노드를 삽입하는 insertAdjacentElement() 메서드도 있다. htmlString 대신 DOM 요소를 직접 전달하는 것만 다르고 나머지 사용법은 동일하다.
</aside>
insertAdjacentHTML
첫 번째 인자로 지정할 수 있는 position 값은 아래와 같다. 대상 요소는 메서드를 호출한 요소를 가리킨다. 위 예시를 기준으로 대상 요소는 <ul>
태그가 된다.
position | 삽입 위치 |
---|---|
"beforebegin" | 대상 요소 바로 이전에 삽입 (부모 요소가 있을 때만 가능) |
"afterend" | 대상 요소 바로 뒤에 삽입 (부모 요소가 있을 때만 가능) |
"afterbegin" | 대상 요소의 첫 번째 자식으로 삽입 |
"beforeend" | 대상 요소의 마지막 자식으로 삽입 |
<main>
<!-- beforebegin 삽입 위치 -->
<ul>
<!-- afterbegin 삽입 위치 -->
<li>Todo 1</li>
<li>Todo 2</li>
<li>Todo 3</li>
<!-- beforeend 삽입 위치 -->
</ul>
<!-- afterend 삽입 위치 -->
</main>
insertAdjacentHTML
두 번째 인자로 전달하는 문자열은 브라우저가 파싱 할 수 있는 유효한 HTML 마크업 형태여야 한다. 열고 닫는 태그를 빼먹지 않도록 주의하자.
"<li>hello</li>" ✅
"<li>hello<li>" ❌
"<li>hello" ❌