MutationObserver â ÑÑо вÑÑÑоеннÑй обÑекÑ, наблÑдаÑÑий за DOM-ÑлеменÑом и запÑÑкаÑÑий колбÑк в ÑлÑÑае изменений.
СнаÑала Ð¼Ñ Ð¿Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð¸Ð¼ÑÑ Ñ ÑинÑакÑиÑом, а заÑем ÑазбеÑÑм пÑимеÑÑ Ð¸ÑполÑзованиÑ.
СинÑакÑиÑ
MutationObserver оÑÐµÐ½Ñ Ð¿ÑоÑÑ Ð² иÑполÑзовании.
СнаÑала Ð¼Ñ ÑоздаÑм наблÑдаÑÐµÐ»Ñ Ð·Ð° изменениÑми Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð»Ð±Ñк-ÑÑнкÑии:
let observer = new MutationObserver(callback);
ÐоÑом пÑикÑеплÑем его к DOM-ÑзлÑ:
observer.observe(node, config);
config â ÑÑо обÑÐµÐºÑ Ñ Ð±ÑлевÑми паÑамеÑÑами «на какие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑеагиÑоваÑÑ»:
childListâ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² непоÑÑедÑÑвеннÑÑ Ð´ÐµÑÑÑnode,subtreeâ во вÑÐµÑ Ð¿Ð¾ÑомкаÑnode,attributesâ в аÑÑибÑÑаÑnode,attributeFilterâ маÑÑив имÑн аÑÑибÑÑов, ÑÑÐ¾Ð±Ñ Ð½Ð°Ð±Ð»ÑдаÑÑ ÑолÑко за вÑбÑаннÑми.characterDataâ наблÑдаÑÑ Ð»Ð¸ заnode.data(ÑекÑÑовое ÑодеÑжимое),
РеÑÑ Ð¿Ð°Ñа опÑий:
characterDataOldValueâ еÑлиtrue, бÑÐ´ÐµÑ Ð¿ÐµÑедаваÑÑ Ð¸ ÑÑаÑое, и новое знаÑениеnode.dataв колбÑк (Ñм далее), инаÑе ÑолÑко новое (Ñакже ÑÑебÑеÑÑÑ Ð¾Ð¿ÑиÑcharacterData),attributeOldValueâ еÑлиtrue, бÑÐ´ÐµÑ Ð¿ÐµÑедаваÑÑ Ð¸ ÑÑаÑое, и новое знаÑение аÑÑибÑÑа в колбÑк (Ñм далее), инаÑе ÑолÑко новое (Ñакже ÑÑебÑеÑÑÑ Ð¾Ð¿ÑиÑattributes).
ÐаÑем, поÑле изменений, вÑполнÑеÑÑÑ callback, в коÑоÑÑй Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿ÐµÑедаÑÑÑÑ Ð¿ÐµÑвÑм аÑгÑменÑом как ÑпиÑок обÑекÑов MutationRecord, а Ñам наблÑдаÑÐµÐ»Ñ Ð¸Ð´ÑÑ Ð²ÑоÑÑм аÑгÑменÑом.
ÐбÑекÑÑ MutationRecord имеÑÑ ÑледÑÑÑие ÑвойÑÑва:
typeâ Ñип изменениÑ, один из:"attributes"изменÑн аÑÑибÑÑ,"characterData"Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð´Ð°Ð½Ð½Ñеelem.data, ÑÑо Ð´Ð»Ñ ÑекÑÑовÑÑ Ñзлов"childList"добавленÑ/ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð´Ð¾ÑеÑние ÑлеменÑÑ,
targetâ где пÑоизоÑло изменение: ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð»Ñ"attributes", ÑекÑÑовÑй Ñзел длÑ"characterData"или ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð»Ñ"childList",addedNodes/removedNodesâ добавленнÑе/ÑдалÑннÑе ÑзлÑ,previousSibling/nextSiblingâ пÑедÑдÑÑий или ÑледÑÑÑий одноÑÑовневÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½ÑÑ /ÑдалÑннÑÑ ÑлеменÑов,attributeName/attributeNamespaceâ имÑ/пÑоÑÑÑанÑÑво имÑн (Ð´Ð»Ñ XML) изменÑнного аÑÑибÑÑа,oldValueâ пÑедÑдÑÑее знаÑение, ÑолÑко Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ аÑÑибÑÑа или ÑекÑÑа, еÑли вклÑÑена ÑооÑвеÑÑÑвÑÑÑÐ°Ñ Ð¾Ð¿ÑиÑattributeOldValue/characterDataOldValue.
ÐÐ»Ñ Ð¿ÑимеÑа возÑмÑм <div> Ñ Ð°ÑÑибÑÑом contentEditable. ÐÑÐ¾Ñ Ð°ÑÑибÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð½Ð°Ð¼ ÑÑокÑÑиÑоваÑÑÑÑ Ð½Ð° ÑлеменÑе, напÑимеÑ, кликнÑв, и оÑÑедакÑиÑоваÑÑ ÑодеÑжимое.
<div contentEditable id="elem">ÐÑÑедакÑиÑÑй <b>менÑ</b>, пожалÑйÑÑа</div>
<script>
let observer = new MutationObserver(mutationRecords => {
console.log(mutationRecords); // console.log(изменениÑ)
});
// наблÑдаÑÑ Ð·Ð° вÑем, кÑоме аÑÑибÑÑов
observer.observe(elem, {
childList: true, // наблÑдаÑÑ Ð·Ð° непоÑÑедÑÑвеннÑми деÑÑми
subtree: true, // и более глÑбокими поÑомками
characterDataOldValue: true // пеÑедаваÑÑ ÑÑаÑое знаÑение в колбÑк
});
</script>
ТепеÑÑ, еÑли Ð¼Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ð¼ ÑекÑÑ Ð²Ð½ÑÑÑи <b>менÑ</b>, Ð¼Ñ Ð¿Ð¾Ð»ÑÑим единиÑное изменение:
mutationRecords = [{
type: "characterData",
oldValue: "менÑ",
target: <text node>,
// дÑÑгие ÑвойÑÑва пÑÑÑÑ
}];
ÐÑли Ð¼Ñ Ð²ÑбеÑем или Ñдалим <b>менÑ</b> полноÑÑÑÑ, Ð¼Ñ Ð¿Ð¾Ð»ÑÑим ÑÑÐ°Ð·Ñ Ð½ÐµÑколÑко изменений:
mutationRecords = [{
type: "childList",
target: <div#elem>,
removedNodes: [<b>],
nextSibling: <text node>,
previousSibling: <text node>
// дÑÑгие ÑвойÑÑва пÑÑÑÑ
}, {
type: "characterData"
target: <text node>
// ...деÑали изменений завиÑÑÑ Ð¾Ñ Ñого, как бÑаÑÐ·ÐµÑ Ð¾Ð±ÑабаÑÑÐ²Ð°ÐµÑ Ñакое Ñдаление
// он Ð¼Ð¾Ð¶ÐµÑ ÑоединиÑÑ Ð´Ð²Ð° ÑоÑедниÑ
ÑекÑÑовÑÑ
Ñзла "ÐÑÑедакÑиÑÑй " и ", пожалÑйÑÑа" в один Ñзел
// или Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑавиÑÑ Ð¸Ñ
ÑазнÑми ÑекÑÑовÑми Ñзлами
}];
Так ÑÑо, MutationObserver позволÑÐµÑ ÑеагиÑоваÑÑ Ð½Ð° лÑбÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² DOM-поддеÑеве.
ÐÑполÑзование Ð´Ð»Ñ Ð¸Ð½ÑегÑаÑии
Ðогда ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ñжно?
ÐÑедÑÑавим ÑиÑÑаÑиÑ, когда Ð²Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑаеÑе ÑÑоÑонний ÑкÑипÑ, коÑоÑÑй добавлÑÐµÑ ÐºÐ°ÐºÑÑ-Ñо полезнÑÑ ÑÑнкÑионалÑноÑÑÑ Ð½Ð° ÑÑÑаниÑÑ, но пÑи ÑÑом Ð´ÐµÐ»Ð°ÐµÑ ÑÑо-Ñо лиÑнее, напÑимеÑ, показÑÐ²Ð°ÐµÑ ÑÐµÐºÐ»Ð°Ð¼Ñ <div class="ads">ÐенÑÐ¶Ð½Ð°Ñ Ñеклама</div>.
РазÑмееÑÑÑ, ÑÑоÑонний ÑкÑÐ¸Ð¿Ñ Ð½Ðµ даÑÑ ÐºÐ°ÐºÐ¸Ñ -Ñо Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð² ÐµÑ ÑбÑаÑÑ.
ÐÑполÑзÑÑ MutationObserver, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ оÑÑледиÑÑ, когда в наÑем DOM поÑвиÑÑÑ Ñакой ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸ ÑдалиÑÑ ÐµÐ³Ð¾. РполезнÑÑ ÑÑнкÑионалÑноÑÑÑ Ð¾ÑÑавиÑÑ. ХоÑÑ, конеÑно, ÑоздаÑели ÑÑоÑоннего ÑкÑипÑа вÑÑд ли обÑадÑÑÑÑÑ, ÑÑо Ð²Ñ Ð¸Ñ
полезнÑй ÑкÑÐ¸Ð¿Ñ Ð²Ð·Ñли, а ÑÐµÐºÐ»Ð°Ð¼Ñ Ñдалили.
ÐÑÑÑ Ð¸ дÑÑгие ÑиÑÑаÑии, когда ÑÑоÑонний ÑкÑÐ¸Ð¿Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÐµÑ ÑÑо-Ñо в Ð½Ð°Ñ Ð´Ð¾ÐºÑменÑ, и Ð¼Ñ Ñ Ð¾Ñели Ð±Ñ Ð¾ÑÑледиÑÑ, когда ÑÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ, ÑÑÐ¾Ð±Ñ Ð°Ð´Ð°Ð¿ÑиÑоваÑÑ Ð½Ð°ÑÑ ÑÑÑаниÑÑ, динамиÑеÑки поменÑÑÑ ÐºÐ°ÐºÐ¸Ðµ-Ñо ÑазмеÑÑ Ð¸ Ñ.п.
MutationObserver Ð´Ð»Ñ ÑÑого как Ñаз оÑлиÑно подÑ
одиÑ.
ÐÑполÑзование Ð´Ð»Ñ Ð°ÑÑ Ð¸ÑекÑÑÑÑ
ÐÑÑÑ Ð¸ ÑиÑÑаÑии, когда MutationObserver Ñ
оÑоÑо подÑ
Ð¾Ð´Ð¸Ñ Ñ Ð°ÑÑ
иÑекÑÑÑной ÑоÑки зÑениÑ.
ÐÑедÑÑавим, ÑÑо Ð¼Ñ ÑоздаÑм ÑÐ°Ð¹Ñ Ð¾ пÑогÑаммиÑовании. ÐÑÑеÑÑвенно, ÑÑаÑÑи на нÑм и дÑÑгие маÑеÑÐ¸Ð°Ð»Ñ Ð¼Ð¾Ð³ÑÑ ÑодеÑжаÑÑ ÑÑагменÑÑ Ñ Ð¸ÑÑ Ð¾Ð´Ð½Ñм кодом.
Такой ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð² HTML-ÑазмеÑке вÑглÑÐ´Ð¸Ñ Ñак:
...
<pre class="language-javascript"><code>
// Ð²Ð¾Ñ ÐºÐ¾Ð´
let hello = "world";
</code></pre>
...
Также на наÑем ÑайÑе Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ JavaScript-библиоÑÐµÐºÑ Ð´Ð»Ñ Ð¿Ð¾Ð´ÑвеÑки ÑинÑакÑиÑа, напÑÐ¸Ð¼ÐµÑ Prism.js. ÐÑзов меÑода Prism.highlightElem(pre) иÑÐµÑ Ñакие ÑлеменÑÑ pre и добавлÑÐµÑ Ð² ниÑ
ÑÑили и Ñеги, коÑоÑÑе в иÑоге даÑÑ ÑвеÑнÑÑ Ð¿Ð¾Ð´ÑвеÑÐºÑ ÑинÑакÑиÑа, подобно Ñой, коÑоÑÑÑ Ð²Ñ Ð²Ð¸Ð´Ð¸Ñе в пÑимеÑаÑ
здеÑÑ, на ÑÑой ÑÑÑаниÑе.
Ðогда конкÑеÑно нам вÑзваÑÑ ÑÑÐ¾Ñ Ð¼ÐµÑод подÑвеÑки? Ðожно по ÑобÑÑÐ¸Ñ DOMContentLoaded или пÑоÑÑо Ð²Ð½Ð¸Ð·Ñ ÑÑÑаниÑÑ Ð½Ð°Ð¿Ð¸ÑаÑÑ ÐºÐ¾Ð´, коÑоÑÑй бÑÐ´ÐµÑ Ð¸ÑкаÑÑ Ð²Ñе pre[class*="language"] и вÑзÑваÑÑ Prism.highlightElem Ð´Ð»Ñ Ð½Ð¸Ñ
:
// вÑделиÑÑ Ð²Ñе пÑимеÑÑ ÐºÐ¾Ð´Ð° на ÑÑÑаниÑе
document.querySelectorAll('pre[class*="language"]').forEach(Prism.highlightElem);
Ðока вÑÑ Ð¿ÑоÑÑо, пÑавда? Ð HTML еÑÑÑ ÑÑагменÑÑ ÐºÐ¾Ð´Ð° в <pre>, и Ð´Ð»Ñ Ð½Ð¸Ñ
Ð¼Ñ Ð²ÐºÐ»ÑÑаем подÑвеÑÐºÑ ÑинÑакÑиÑа.
ÐдÑм далÑÑе. ÐÑедÑÑавим, ÑÑо Ð¼Ñ ÑобиÑаемÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки подгÑÑжаÑÑ Ð¼Ð°ÑеÑÐ¸Ð°Ð»Ñ Ñ ÑеÑвеÑа. Ðозже в ÑÑебнике Ð¼Ñ Ð¸Ð·ÑÑим ÑпоÑÐ¾Ð±Ñ Ð´Ð»Ñ ÑÑого. Ðа даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение ÑолÑко Ñо, ÑÑо Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем HTML-ÑÑаÑÑÑ Ñ Ð²ÐµÐ±-ÑеÑвеÑа и показÑваем ÐµÑ Ð¿Ð¾ запÑоÑÑ:
let article = /* полÑÑиÑÑ Ð½Ð¾Ð²ÑÑ ÑÑаÑÑÑ Ñ ÑеÑвеÑа */
articleElem.innerHTML = article;
HTML подгÑÑжÑнной ÑÑаÑÑи article Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¿ÑимеÑÑ ÐºÐ¾Ð´Ð°. Ðам нÑжно вÑзваÑÑ Prism.highlightElem Ð´Ð»Ñ Ð½Ð¸Ñ
, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´ÑвеÑиÑÑ ÑинÑакÑиÑ.
ÐÑо и когда должен вÑзÑваÑÑ Prism.highlightElem Ð´Ð»Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки загÑÑженной ÑÑаÑÑи?
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ добавиÑÑ ÑÑÐ¾Ñ Ð²Ñзов к кодÑ, коÑоÑÑй загÑÑÐ¶Ð°ÐµÑ ÑÑаÑÑÑ, напÑимеÑ, Ñак:
let article = /* полÑÑиÑÑ Ð½Ð¾Ð²ÑÑ ÑÑаÑÑÑ Ñ ÑеÑвеÑа */
articleElem.innerHTML = article;
let snippets = articleElem.querySelectorAll('pre[class*="language-"]');
snippets.forEach(Prism.highlightElem);
â¦Ðо пÑедÑÑавÑÑе, ÑÑо Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ меÑÑ Ð² коде, где Ð¼Ñ Ð·Ð°Ð³ÑÑжаем ÑÑо-либо: ÑÑаÑÑи, опÑоÑÑ, поÑÑÑ ÑоÑÑма. ÐÑжно ли нам в каждÑй Ñакой вÑзов добавлÑÑÑ Prism.highlightElem? ÐолÑÑиÑÑÑ Ð½Ðµ оÑÐµÐ½Ñ Ñдобно, да и можно легко забÑÑÑ ÑделаÑÑ ÑÑо.
Ð ÑÑо, еÑли ÑодеÑжимое загÑÑжаеÑÑÑ Ð²Ð¾Ð¾Ð±Ñе ÑÑоÑонним кодом? ÐапÑимеÑ, Ñ Ð½Ð°Ñ ÐµÑÑÑ ÑоÑÑм, напиÑаннÑй дÑÑгим Ñеловеком, загÑÑжаÑÑий ÑодеÑжимое динамиÑеÑки, и нам Ð·Ð°Ñ Ð¾ÑелоÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ðº Ð½ÐµÐ¼Ñ Ð²Ñделение ÑинÑакÑиÑа. ÐикÑо не лÑÐ±Ð¸Ñ Ð¿ÑавиÑÑ ÑÑжие ÑкÑипÑÑ.
Ð ÑÑаÑÑÑÑ, еÑÑÑ Ð´ÑÑгой ваÑианÑ.
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ MutationObserver, ÑÑÐ¾Ð±Ñ Ð°Ð²ÑомаÑиÑеÑки опÑеделÑÑÑ Ð¼Ð¾Ð¼ÐµÐ½Ñ, когда пÑимеÑÑ ÐºÐ¾Ð´Ð° поÑвлÑÑÑÑÑ Ð½Ð° ÑÑÑаниÑе, и подÑвеÑиваÑÑ Ð¸Ñ
.
Тогда вÑÑ ÑÑнкÑионалÑноÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´ÑвеÑки ÑинÑакÑиÑа бÑÐ´ÐµÑ Ð² одном меÑÑе, а Ð¼Ñ Ð±Ñдем Ð¸Ð·Ð±Ð°Ð²Ð»ÐµÐ½Ñ Ð¾Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи инÑегÑиÑоваÑÑ ÐµÑ.
ÐÑÐ¸Ð¼ÐµÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑкой подÑвеÑки ÑинÑакÑиÑа
ÐÐ¾Ñ ÑабоÑаÑÑий пÑимеÑ.
ÐÑли Ð²Ñ Ð·Ð°Ð¿ÑÑÑиÑе ÑÑÐ¾Ñ ÐºÐ¾Ð´, он наÑнÑÑ Ð½Ð°Ð±Ð»ÑдаÑÑ Ð·Ð° ÑлеменÑом ниже, подÑвеÑÐ¸Ð²Ð°Ñ ÐºÐ¾Ð´ лÑбого пÑимеÑа, коÑоÑÑй поÑвлÑеÑÑÑ Ñам:
let observer = new MutationObserver(mutations => {
for(let mutation of mutations) {
// пÑовеÑим новÑе ÑзлÑ, еÑÑÑ Ð»Ð¸ ÑÑо-Ñо, ÑÑо надо подÑвеÑиÑÑ?
for(let node of mutation.addedNodes) {
// оÑÑлеживаем ÑолÑко ÑзлÑ-ÑлеменÑÑ, дÑÑгие (ÑекÑÑовÑе) пÑопÑÑкаем
if (!(node instanceof HTMLElement)) continue;
// пÑовеÑиÑÑ, не ÑвлÑеÑÑÑ Ð»Ð¸ вÑÑавленнÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿ÑимеÑом кода
if (node.matches('pre[class*="language-"]')) {
Prism.highlightElement(node);
}
// или, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ, пÑÐ¸Ð¼ÐµÑ ÐºÐ¾Ð´Ð° еÑÑÑ Ð² его поддеÑеве?
for(let elem of node.querySelectorAll('pre[class*="language-"]')) {
Prism.highlightElement(elem);
}
}
}
});
let demoElem = document.getElementById('highlight-demo');
observer.observe(demoElem, {childList: true, subtree: true});
Ðиже наÑ
одиÑÑÑ HTML-ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸ JavaScript, коÑоÑÑй его динамиÑеÑки Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸Ñ Ð¿ÑимеÑом кода ÑеÑез innerHTML.
ÐожалÑйÑÑа, запÑÑÑиÑе пÑедÑдÑÑий код (он наблÑÐ´Ð°ÐµÑ Ð·Ð° ÑÑим ÑлеменÑом), а заÑем код, ÑаÑположеннÑй ниже. ÐÑ ÑвидиÑе как MutationObserver обнаÑÑÐ¶Ð¸Ñ Ð¸ подÑвеÑÐ¸Ñ ÑÑагменÑÑ ÐºÐ¾Ð´Ð°.
Ðемо-ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ id="highlight-demo", за коÑоÑÑм ÑÐ»ÐµÐ´Ð¸Ñ ÐºÐ¾Ð´ пÑимеÑа вÑÑе.
let demoElem = document.getElementById('highlight-demo');
// динамиÑеÑки вÑÑавиÑÑ ÑодеÑжимое как ÑÑагменÑÑ ÐºÐ¾Ð´Ð°
demoElem.innerHTML = `ФÑÐ°Ð³Ð¼ÐµÐ½Ñ ÐºÐ¾Ð´Ð° ниже:
<pre class="language-javascript"><code> let hello = "world!"; </code></pre>
<div>ÐÑÑ Ð¾Ð´Ð¸Ð½:</div>
<div>
<pre class="language-css"><code>.class { margin: 5px; } </code></pre>
</div>
`;
ТепеÑÑ Ñ Ð½Ð°Ñ ÐµÑÑÑ MutationObserver, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑлеживаÑÑ Ð²ÑÑÐ°Ð²ÐºÑ ÐºÐ¾Ð´Ð° в наблÑдаемÑÑ
ÑлеменÑаÑ
или во вÑÑм докÑменÑе. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ добавлÑÑÑ/ÑдалÑÑÑ ÑÑагменÑÑ ÐºÐ¾Ð´Ð° в HTML, не задÑмÑваÑÑÑ Ð¾Ð± иÑ
подÑвеÑке.
ÐополниÑелÑнÑе меÑодÑ
ÐеÑод, оÑÑанавливаÑÑий наблÑдение за Ñзлом:
observer.disconnect()â оÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð½Ð°Ð±Ð»Ñдение.
ÐмеÑÑе Ñ Ð½Ð¸Ð¼ иÑполÑзÑÑÑ Ð¼ÐµÑод:
mutationRecords = observer.takeRecords()â полÑÑÐ°ÐµÑ ÑпиÑок необÑабоÑаннÑÑ Ð·Ð°Ð¿Ð¸Ñей изменений, коÑоÑÑе пÑоизоÑли, но колбÑк Ð´Ð»Ñ Ð½Ð¸Ñ ÐµÑÑ Ð½Ðµ вÑполнилÑÑ.
// Ð¼Ñ Ð¾ÑклÑÑаем наблÑдаÑелÑ
observer.disconnect();
// он, возможно, не ÑÑпел обÑабоÑаÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе изменениÑ
let mutationRecords = observer.takeRecords();
// обÑабоÑаÑÑ mutationRecords
СбоÑка мÑÑоÑа
ÐбÑекÑÑ MutationObserver иÑполÑзÑÑÑ Ð²Ð½ÑÑÑи ÑÐµÐ±Ñ Ñак назÑваемÑе «ÑлабÑе ÑÑÑлки» на ÑзлÑ, за коÑоÑÑми ÑмоÑÑÑÑ. Так ÑÑо еÑли Ñзел ÑдалÑн из DOM и болÑÑе не доÑÑижим, Ñо он бÑÐ´ÐµÑ ÑдалÑн из памÑÑи вне завиÑимоÑÑи Ð¾Ñ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ Ð½Ð°Ð±Ð»ÑдаÑелÑ.
ÐÑого
MutationObserver Ð¼Ð¾Ð¶ÐµÑ ÑеагиÑоваÑÑ Ð½Ð° Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² DOM: аÑÑибÑÑÑ, добавленнÑе/ÑдалÑннÑе ÑлеменÑÑ, ÑекÑÑовое ÑодеÑжимое.
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÐµÐ³Ð¾, ÑÑÐ¾Ð±Ñ Ð¾ÑÑлеживаÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, пÑоизводимÑе дÑÑгими ÑаÑÑÑми наÑего ÑобÑÑвенного кода, а Ñакже инÑегÑиÑоваÑÑÑÑ Ñо ÑÑоÑонними библиоÑеками.
MutationObserver Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑлеживаÑÑ Ð»ÑбÑе изменениÑ. РазнÑе опÑии конÑигÑÑаÑии «ÑÑо наблÑдаÑÑ» пÑедназнаÑÐµÐ½Ñ Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑии, ÑÑÐ¾Ð±Ñ Ð½Ðµ ÑÑаÑиÑÑ ÑеÑÑÑÑÑ Ð½Ð° лиÑние вÑÐ·Ð¾Ð²Ñ ÐºÐ¾Ð»Ð±Ñка.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)