๐ MutationObserver - DOM์ ๋ณํ๋ฅผ ๊ฐ์
MutationObserver
๋์ ์ผ๋ก ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ ๋ ํ์ด์ง์ ๋ณ๊ฒฝ์ฌ๋ถ๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด, ajax๋ก DOM ์๋ฆฌ๋จผํธ๋ฅผ ์ถ๊ฐ/์ญ์ ํ ๊ฒฝ์ฐ ๊ทธ ๋ณํ๋ฅผ ๊ฐ์งํด์ผ ํ๋ค.
์๋ ์๋ DOMSubtreeModified ๋ฅผ ๋ง์ด ์ฌ์ฉํ์์ง๋ง DOMSubtreeModified์ ์๋ชป ์ฌ์ฉํ๋ฉด ๋ฌดํ๋ฃจํ์ ๋น ์ง๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ ํดํด์ DOM ์ด๋ฒคํธ ํ์ค์์ ์ง์์ด ์ค๋จ๋์๋ค. setTimeout์ด๋ setInterval์ ์ฌ์ฉํ์ฌ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฒดํฌํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ๊ทธ๊ฒ๋ณด๋ค๋ ๋์ฒด๋ก ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด MutationObserver๋ค.
MutationObserver๋ DOM์ ๋ณํ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฐ์ํ๋ค. DOM์ ์์ฑ, ํ ์คํธ, ์์ ๋ ธ๋๋ค์ ๋ํ ๋ณ๊ฒฝ์ ๊ฐ์งํ ์ ์๋ค.
MutationObserver ์ฌ์ฉ๋ฒ
// 1. ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฐ์งํ ๋์ ์์ ์ ์
const target = document.getElementById('id');
// 2. ์ต์ ๋ฒ ์ฝ๋ฐฑ ์์ฑ
const callback = (mutationList, observer) => {
console.log(mutationList);
};
// 3. ์ต์ ๋ฒ ์ธ์คํด์ค ์์ฑ
const observer = new MutationObserver(callback); // ํ๊ฒ์ ๋ณํ๊ฐ ์ผ์ด๋๋ฉด ์ฝ๋ฐฑํจ์๋ฅผ ์คํํ๊ฒ ๋๋ค.
// 4. DOM์ ์ด๋ค ๋ถ๋ถ์ ๊ฐ์ํ ์ง๋ฅผ ์ต์
์ค์
const config = {
attributes: true, // ์์ฑ ๋ณํ ํ ๋ ๊ฐ์ง
childList: true, // ์์๋
ธ๋ ์ถ๊ฐ/์ ๊ฑฐ ๊ฐ์ง
characterData: true // ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ด์ฉ ๊ธฐ๋ก
};
// 5. ๊ฐ์ง ์์
observer.observe(target, config);
// 6. ๊ฐ์ง ์ค์ง
observer.disconnect();
๋ณ๊ฒฝ์ ๊ฐ์งํ ์๋ฆฌ๋จผํธ ๋์์ ์ ์ ํ ๋, ๋ณ๊ฒฝ๋๋ ์์๋ค์ ๊ฐ์ฅ ์์ ๋ถ๋ชจ ์์๋ฅผ ๊ณจ๋ผ์ผํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ ๋ณํ ๊ฐ์ง๊ฐ ์๋๋ค.
MutationObserver ์ฝ๋ฐฑ ์ธ์
const callback = (mutationList, observer) => {
console.log(mutationList, observer);
};
์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ
์ฝ๋ฐฑ ํจ์๋ ์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ๋ณ๊ฒฝ ์ฌํญ์ ํํํ๋ ๊ฐ์ฒด ํํ์ ๋ฐฐ์ด์ ๋ฐ๋๋ค.
- type : ๋ณ๊ฒฝ์ฌํญ์ ํ์
. 'attributes', 'characterData', childList' ์ค ํ๋์ ๊ฐ์ ๊ฐ์ง๋ค.
"attributes" - ์์ฑ์ด ๋ณ๊ฒฝ๋จ
"characterData" - ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ (text node)
"childList" - ์์ ๋ ธ๋๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋จ - target : ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์ํ ํ๊ฒ ๋ ธ๋
- addedNodes/removedNodes : ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ๋ ธ๋
- previousSibling/nextSibling : ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ๋ ธ๋์ previous/next ํ์ ๋ ธ๋
- attributeName/attributeNamespace : ๋ณ๊ฒฝ๋ ์์ฑ์ ์ด๋ฆ
- oldValue : ๋ณ๊ฒฝ ์ด์ ์ ๊ฐ. ์์ฑ์ด๋ ํ ์คํธ๊ฐ ๋ณ๊ฒฝ๋์์ ๊ฒฝ์ฐ, attributeOldValue/characterDataOldValue ์ต์ ์ ์ฃผ์์ ๊ฒฝ์ฐ์ ๋ฐ์์ฌ ์ ์๋ค.
๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ
๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก๋ observer ๊ฐ์ฒด ์์ ์ ๋ฐ์ ์ ์๋ค.
MutationObserver ์ต์ ์ข ๋ฅ
์ด ์ต์ ์ ์ค์ ์ ๋ฐ๋ผ mutations์ด ์ฌ๋ฌ ๋ฒ ์คํ๋ ์ ์์ผ๋ฏ๋ก, ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๊ฐ๋ฅํ๋ฉด ํ์ํ ๊ฒ๋ง ์ ํํ๊ฒ ์ค์ ์ ๋ถ์ฌํ๋ ๊ฒ์ด ์ข๋ค.
์์ฑ | ๊ฐ | ์ค๋ช |
childList | true / false | ๋์ ๋ ธ๋์ ํ์ ์์์ ์ถ๊ฐ ๋ฐ ์ ๊ฑฐ๋ฅผ ๊ฐ์ํฉ๋๋ค. |
attributes | true / false | ๋์ ๋ ธ๋์ ์์ฑ์ ๋ํ ๋ณํ๋ฅผ ๊ฐ์ํฉ๋๋ค. |
characterData | true / false | ๋์ ๋ ธ๋์ ๋ฐ์ดํฐ์ ๋ํ ๋ณํ๋ฅผ ๊ฐ์ํฉ๋๋ค. |
subtree | true / false | ๋์ ๋ ธ๋์ ์์ ๋ฟ๋ง ์๋๋ผ ์์ ์ดํ๋ก ๋ชจ๋ ๊ฐ์ํฉ๋๋ค. |
attributeOldValue | true / false | ๋์ ๋ ธ๋์ ์์ฑ ๋ณ๊ฒฝ ์ ์ ๋ด์ฉ๋ ๊ธฐ๋ก์ ๋จ๊น๋๋ค. |
characterDataOldValue | true / false | ๋์ ๋ ธ๋์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ์ ๋ด์ฉ๋ ๊ธฐ๋ก์ ๋จ๊น๋๋ค. |
attributeFilter | [ "A", "B" ] | ๋ชจ๋ ์์ฑ ๋์ฐ๋ณ์ด๋ฅผ ๊ด์ฐฐ ํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ ์์ฑ ๋ค์ ์คํ์ด์ค์์ด ์์ฑ ๋ก์ปฌ ์ด๋ฆ์ ๋ฐฐ์ด๋ก ์ค์ ํฉ๋๋ค. |
์ด์ธ์ ๋ธ๋ผ์ฐ์ ๊ฐ์ง ์ธํฐํ์ด์ค๋ค
- IntersectionObserver : ๋ฃจํธ ์์ญ(๋ทฐํฌํธ)์ ๋์ ๊ฐ์ฒด์ ๊ฒน์นจ์ ๊ฐ์
- MutationObserver : ๊ฐ์ฒด์ ์์ฑ ๋ณ๊ฒฝ์ ๊ฐ์
- PerformanceObserver : ํ๋ก์ธ์ค ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
- ReportingObserver : ์น ์ฌ์ดํธ์ ํ์ค ๋ฐ ์ ์ฑ ์ค์ ํํฉ์ ๊ฐ์
- ResizeObserver : ๊ฐ์ฒด์ ๋๋น, ๋์ด์ ๋ณํ๋ฅผ ๊ฐ์
# ์ฐธ๊ณ ์๋ฃ
https://www.zerocho.com/category/HTML&DOM/post/5be24eacdb0c31001c4c5040
https://velog.io/@ggong/MutationObserver