Language/JavaScript (WEB)

๐ŸŒ MutationObserver - DOM์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์‹œ

์ธํŒŒ_ 2022. 1. 10. 11:37

MutationObserver

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);
};

 

์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ์ฒด ํ˜•ํƒœ์˜ ๋ฐฐ์—ด์„ ๋ฐ›๋Š”๋‹ค.

MutationObserver

  • type : ๋ณ€๊ฒฝ์‚ฌํ•ญ์˜ ํƒ€์ž…. 'attributes', 'characterData', childList' ์ค‘ ํ•˜๋‚˜์˜ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.
    "attributes" - ์†์„ฑ์ด ๋ณ€๊ฒฝ๋จ
    "characterData" - ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์‹œ (text node)
    "childList" - ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋จ
  • target : ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•œ ํƒ€๊ฒŸ ๋…ธ๋“œ
  • addedNodes/removedNodes : ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋œ ๋…ธ๋“œ
  • previousSibling/nextSibling : ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋œ ๋…ธ๋“œ์˜ previous/next ํ˜•์ œ ๋…ธ๋“œ
  • attributeName/attributeNamespace : ๋ณ€๊ฒฝ๋œ ์†์„ฑ์˜ ์ด๋ฆ„
  • oldValue : ๋ณ€๊ฒฝ ์ด์ „์˜ ๊ฐ’. ์†์„ฑ์ด๋‚˜ ํ…์ŠคํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ, attributeOldValue/characterDataOldValue ์˜ต์…˜์„ ์ฃผ์—ˆ์„ ๊ฒฝ์šฐ์— ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ

๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ๋Š” observer ๊ฐ์ฒด ์ž์‹ ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

MutationObserver


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