MutationObserver는 DOM 트리의 변경을 감지한다.
이를 사용하면 실시간으로 DOM의 변경을 감지하고, 처리할 수 있다.
⛄️ 예제
간단하게 댓글을 다는 HTML을 구현해보자.
그리고, 새로운 댓글이 추가될 때 마다 이를 MutationObserver로 감지해서 alert를 띄우는 예제를 구현해보기로 했다.
일단, 기본적으로 댓글을 추가하는 HTML과 자바스크립트를 작성해준다.
<div id="root">
<h2>Comment List</h2>
<div id="comments"></div>
<div id="input_div">
<input type="text" placeholder="write comments..." class="text_input"/>
<button class="input_btn">add</button>
</div>
</div>
const inputDiv = document.getElementById("input_div");
const textInput = document.getElementsByClassName("text_input")[0];
const inputBtn = document.getElementsByClassName("input_btn")[0];
inputBtn.addEventListener("click", () => {
const text = textInput.value;
if(!text) {
return;
}
const addDiv = document.createElement('p');
addDiv.innerText = text;
inputDiv.appendChild(addDiv);
})
그리고, 이 예제에 이제 댓글 p태그가 input div에 추가될 때 MutationObserver는 이를 탐지하고 alert를 띄울 수 있도록 코드를 더 작성해주자.
// 옵션을 통해서 감지할 대상을 설정할 수 있다.
const config = { attributes: true, childList: true, subtree: true };
// 변경 감지 시 실행할 콜백 함수
const callback = (mutationList, observer) => {
for (const mutation of mutationList) {
if (mutation.type === "childList") {
console.log("자식 노드가 추가되거나 제거됐습니다.");
window.alert("댓글이 추가됨!"); // 알림 추가!
} else if (mutation.type === "attributes") {
console.log(`${mutation.attributeName} 특성이 변경됐습니다.`);
}
}
};
// 콜백 함수에 연결된 감지기 인스턴스 생성
const observer = new MutationObserver(callback);
// 설정한 변경의 감지 시작
observer.observe(inputDiv, config);
// 이후 감지 중단 가능
// observer.disconnect();
아래의 참고 문서를 작성하여 위와 같이 댓글이 추가되었을 떄 alert를 띄우는 코드를 작성할 수 있었다.
DOM에 어떤 변화가 있었는지에 따라서 다르게 처리할 수도 있기에 유용한 점이 많은 것 같다.
더 이상 감지 기능을 사용하지 않는다면, disconnect로 감지를 중단할 수 있다.
☄️ 참고 문서
https://developer.mozilla.org/ko/docs/Web/API/MutationObserver
MutationObserver - Web API | MDN
MutationObserver 인터페이스는 DOM 트리의 변경을 감지하는 기능을 제공합니다. DOM3 이벤트 명세의 일부였던 Mutation Events (en-US)를 대체합니다.
developer.mozilla.org
'JavaScript' 카테고리의 다른 글
try catch의 함정 (0) | 2023.11.05 |
---|---|
await와 then 함께쓰기? (0) | 2023.10.29 |
자바스크립트 동적으로 객체 생성하기 (Computed Property Names) (0) | 2023.10.05 |
URLSearchParams로 Url Query String 가져오기 (0) | 2023.10.03 |
BFS(Breadth-First Search) 알고리즘 구현하기 (자바스크립트) (0) | 2023.09.30 |