ÙÙ
Ø§Ù Ø·ÙØ± Ú©Ù Ù
Û Ø¯Ø§ÙÛÙ
MutationObserver ÛÚ© inner object است Ú©Ù ÛÚ© Ø¹ÙØµØ± DOM را Ù
Ø´Ø§ÙØ¯Ù Ù
Û Ú©ÙØ¯ Ù ÙÙگاÙ
Û Ú©Ù ØªØºÛÛØ±Û را ØªØ´Ø®ÛØµ Ù
Û Ø¯ÙØ¯ ÛÚ© تÙ
اس Ø¨Ø±Ú¯Ø´ØªÛ Ø§ÛØ¬Ø§Ø¯ Ù
Û Ú©ÙØ¯.
Weâll first take a look at the syntax, and then explore a real-world use case, to see where such thing may be useful.
سÛÙØªÚ©Ø³
Ø§Ø³ØªÙØ§Ø¯Ù از MutationObserver Ø¨Ø³ÛØ§Ø± ساد٠است.
اÙ٠از ÙÙ ÙØ ÛÚ© observer با Ø§Ø³ØªÙØ§Ø¯Ù از callback-function Ù Û Ø³Ø§Ø²ÛÙ :
let observer = new MutationObserver(callback);
٠بعد observer را ب٠DOM nodeØ attach Ù Û Ú©ÙØ¯.
observer.observe(node, config);
(کاÙÙÛÚ¯)config ÛÚ© Ø´Û Ø¨Ø§ boolean options âØ¨Ù ÚÙ ÙÙØ¹ تغÛÛØ±Ø§ØªÛ Ø¨Ø§ÛØ¯ ÙØ§Ú©ÙØ´ ÙØ´Ø§Ù Ø¯Ø§Ø¯â Ø§Ø³Øª:
childListânodeاز direct children تغÛÛØ±Ø§ØªÛ درsubtreeânodeدر ÙÙ Ù ÙØ±Ø²ÙداÙattributesâ attributes ÙØ§Ûnode,attributeFilter--Ú©Ù ÙÙØ· سÙکت Ø´Ø¯Ù ÙØ§ را ببÛÙÛÙ Øattribute name ÛÚ© اراÛ٠ازcharacterDataâ whether to observenode.data(text content),characterDataâ Ø§Ûاnode.data(text content) را Ù Ø´Ø§ÙØ¯Ù Ú©ÙÛÙ ÛØ§ ÙÙ
ÚÙØ¯ گزÛÙ٠دÛگر:
attributeOldValue--Ø¨ÙØ¯ ÙÙ Ù ÙØ¯Ø§Ø± ÙØ°ÛÙ Ù ÙÙ Ù ÙØ¯Ø§Ø± Ø¬Ø¯ÛØ¯ attribute ب٠callback پاس Ø¯Ø§Ø¯Ù Ù Û Ø´ÙØ¯trueاگرcharacterDataOldValue--(needscharacterDataoption) پاس Ù Û Ø¯ÙÛÙ Ø Ø¯Ø± ØºÛØ± اÛÙ ØµÙØ±Øª ÙÙØ· Ù ÙØ¯Ø§Ø± Ø¬Ø¯ÛØ¯ را callback را ÛÙnode.dataØ¨ÙØ¯ ÙÙ Ù ÙØ¯Ø§Ø± Ø¬Ø¯ÛØ¯ Ù ÙÙ Ù ÙØ¯Ø§Ø± ÙØ¯ÛÙtrueاگر
سپس پس از ÙØ± تغÛÛØ±ÛØ callback اجرا Ù
ÛâØ´ÙØ¯: تغÛÛØ±Ø§Øª در آرگÙÙ
ا٠اÙ٠بÙâØ¹ÙÙØ§Ù ÙÙØ±Ø³ØªÛ از Ø§Ø´ÛØ§Ø¡ MutationRecord Ù Ø®ÙØ¯ Ù
Ø´Ø§ÙØ¯Ùâگر بÙâØ¹ÙÙØ§Ù Ø§Ø³ØªØ¯ÙØ§Ù دÙÙ
است.
Ø´Û (object) ÙØ§Û MutationRecord properties ÙØ§ÛÛ Ø¯Ø§Ø±ÙØ¯:
typeâ mutation type, ÛÚ©Û Ø§Ø² Ù ÙØ§Ø±Ø¯ Ø²ÛØ±"attributes": attribute modified"characterData": data modified, used for text nodes,"childList": child elements added/removed,
targetâ"childList"mutation Ø¨Ø±Ø§Û element Ù ÛØ§"characterData"Ø¨Ø±Ø§Û text node ÛØ§"attributes"جاÛÛ Ú©Ù ØªØºÛÛØ± رخ داد٠است: ÛÚ© Ø¹ÙØµØ± براÛaddedNodes/removedNodesâ Ø´Ø¯Ù Ø§ÙØ¯ added/removed ÙØ§ÛÛ Ú©Ù (nodes)ÙÙØ¯previousSibling/nextSibling--added/removed nodes Ø®ÙØ§Ùر ÛØ§ برادر ÙØ¨ÙÛ ÛØ§ Ø¬Ø¯ÛØ¯ØattributeName/attributeNamespaceâ changed attribute (XML) Ø¨Ø±Ø§Û namespace Ø§Ø³Ù ÛØ§oldValueâ .ØªÙØ¸ÛÙ Ø´ÙØ¯attributeOldValue/characterDataOldValueÙ ÙØ¯Ø§Ø± ÙØ¨ÙÛØ ÙÙØ· Ø¨Ø±Ø§Û ØªØºÛÛØ± ÙÛÚÚ¯Û ÛØ§ Ù ØªÙ Ù Û Ø¨Ø§Ø´Ø¯Ø Ø§Ú¯Ø± گزÛÙÙ Ù Ø±Ø¨ÙØ·Ù
Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ در Ù
Ø«Ø§Ù Ø²ÛØ± ÛÚ© <div> با ÛÚ© contentEditable ÙØ¬Ùد دارد. اÛÙ attribute ب٠Ù
ا اجاز٠Ù
ÛØ¯Ùد رÙÛ Ø¢Ù Ù Ø§Ø¯ÛØª کرد٠آ٠تÙ
رکز Ú©ÙÛÙ
.
<div contentEditable id="elem">Click and <b>edit</b>, please</div>
<script>
let observer = new MutationObserver(mutationRecords => {
console.log(mutationRecords); // console.log(the changes)
});
// observe everything except attributes
observer.observe(elem, {
childList: true, // observe direct children
subtree: true, // and lower descendants too
characterDataOldValue: true // pass old data to callback
});
</script>
اگر Ù
ا اÛ٠کد را در browser run Ú©ÙÛÙ
Ø Ù Ø¨Ø¹Ø¯ رÙÛ <div> داد٠شد٠٠تغÛÛØ±Ø§Øª درÙÙ <b>edit</b> تÙ
رکز Ú©ÙÛÙ
Ø console.log ÛÚ© mutation ÙØ´Ø§Ù Ù
Û Ø¯ÙØ¯:
mutationRecords = [{
type: "characterData",
oldValue: "edit",
target: <text node>,
// other properties empty
}];
اگر Ù
ا Ø§Ø¯ÛØª ÙØ§Û Ù¾ÛÚÛØ¯Ù ØªØ±Û Ø±Ø§ اجرا Ú©ÙÛÙ
Ø Ù
اÙÙØ¯ رÛÙ
٠کرد٠<b>edit</b>Ø Ø¢Ù Ú¯Ø§Ù mutation event Ù
Ù
ک٠است شاÙ
Ù ØªØ¹Ø¯Ø§Ø¯Û mutation records باشد:
mutationRecords = [{
type: "childList",
target: <div#elem>,
removedNodes: [<b>],
nextSibling: <text node>,
previousSibling: <text node>
// other properties empty
}, {
type: "characterData"
target: <text node>
// ...mutation details depend on how the browser handles such removal
// it may coalesce two adjacent text nodes "edit " and ", please" into one node
// or it may leave them separate text nodes
}];
Ù¾Ø³Ø MutationObserver اجاز٠Ù
Û Ø¯ÙØ¯ Ú©Ù Ø¨Ù ÙØ± اغÛÛØ±Û در DOM subtree ÙØ§Ú©ÙØ´ ÙØ´Ø§Ù دÙÛÙ
.
کاربرد ÙØ§Û integration
Ú٠ز٠اÙÛ Ø§ÛÙ Ø§ØªÙØ§Ùات Ø¨Ù ØµÙØ±Øª دÛÙØ§Ùت رخ Ù Û Ø¯ÙÙØ¯Ø
Ø´Ø±Ø§ÛØ·Û را ØªØµÙØ± Ú©ÙÛØ¯ Ú©Ù Ø¨Ø§ÛØ¯ ÛÚ© اسکرÛپت شخص Ø«Ø§ÙØ« اضاÙÙ Ú©ÙÛØ¯ Ú©Ù ØØ§ÙÛ Ø¹Ù
Ùکرد Ù
ÙÛØ¯ Ø¨Ø§Ø´Ø¯Ø Ø§Ù
ا ÙÙ
ÚÙÛÙ Ú©Ø§Ø±Û ÙØ§Ø®ÙØ§Ø³ØªÙ Ø§ÙØ¬Ø§Ù
Ø¯ÙØ¯Ø ب٠عÙÙØ§Ù Ù
ثا٠تبÙÛØºØ§Øª <div class="ads">Unwanted ads</div> را ÙØ´Ø§Ù Ù
Û Ø¯ÙØ¯.
Ø¨Ù Ø·ÙØ± Ø·Ø¨ÛØ¹ÛØ Ø§Ø³Ú©Ø±Ûپت شخص Ø«Ø§ÙØ« ÙÛÚ Ù Ú©Ø§ÙÛØ²Ù Û Ø¨Ø±Ø§Û ØØ°Ù آ٠ارائ٠ÙÙ Û Ø¯ÙØ¯.
با Ø§Ø³ØªÙØ§Ø¯Ù از MutationObserverØ Ù
Û ØªÙØ§ÙÛÙ
ØªØ´Ø®ÛØµ دÙÛÙ
Ú©Ù Ø¹ÙØµØ± ÙØ§Ø®Ùاست٠در DOM Ù
ا Ø¸Ø§ÙØ± Ù
Û Ø´ÙØ¯ ٠آ٠را ØØ°Ù Ù
Û Ú©ÙÛÙ
.
Ù ÙÙØ¹ÛتâÙØ§Û دÛÚ¯Ø±Û ÙÙ ÙØ¬Ùد دارد Ú©Ù ÛÚ© اسکرÛپت شخص Ø«Ø§ÙØ« ÚÛØ²Û را Ø¨Ù Ø³ÙØ¯ ٠ا اضاÙÙ Ù ÛâÚ©ÙØ¯Ø ٠٠ا Ù ÛâØ®ÙØ§ÙÛ٠ز٠اÙÛ Ú©Ù Ø§ÛÙ Ø§ØªÙØ§Ù Ù ÛâØ§ÙØªØ¯Ø ØµÙØÙ Ø®ÙØ¯ را تطبÛ٠دÙÛÙ Ø Ø§ÙØ¯Ø§Ø²Ù ÚÛØ²Û را Ø¨Ù ØµÙØ±Øª Ù¾ÙÛØ§ تغÛÛØ± Ø§ÙØ¯Ø§Ø²Ù دÙÛÙ Ù ØºÛØ±Ù.
ÙÙ
ÚÙÛÙ MutationObserver اÙ
Ú©Ø§Ù Ø§Ø¬Ø±Ø§Û Ø§Û٠را ÙØ±Ø§ÙÙ
Ù
Û Ú©ÙØ¯.
کاربرد ÙØ§Û architecture
ÙÙ
ÚÙÛÙ Ø´Ø±Ø§ÛØ·Û ÙØ¬Ùد دارد Ú©Ù MutationObserver از ÙØ¸Ø± Ù
عÙ
Ø§Ø±Û Ø®ÙØ¨ است.
ÙØ±Ø¶ Ú©ÙÛØ¯ در ØØ§Ù ساخت ÛÚ© ÙØ¨ Ø³Ø§ÛØª در Ù ÙØ±Ø¯ Ø¨Ø±ÙØ§Ù Ù ÙÙÛØ³Û ÙØ³ØªÛÙ . Ø¨Ù Ø·ÙØ± Ø·Ø¨ÛØ¹ÛØ Ù ÙØ§Ùات Ù Ø³Ø§ÛØ± Ù Ø·Ø§ÙØ¨ ٠٠ک٠است ØØ§ÙÛ Ú©Ø¯ Ù ÙØ¨Ø¹ Ø¨Ø§Ø´ÙØ¯.
ÚÙÛÙ ÙØ·Ø¹Ù Ø§Û Ø¯Ø± ÙØ´Ø§ÙÙ Ú¯Ø°Ø§Ø±Û HTML Ø¨Ù Ø´Ú©Ù Ø²ÛØ± است:
...
<pre class="language-javascript"><code>
// here's the code
let hello = "world";
</code></pre>
...
Ú©Ø±Ø¯Ù Ø¢ÙØ از کتابخاÙÙ Ø¨Ø±Ø¬Ø³ØªÙ Ø³Ø§Ø²Û ÙØÙÛ Ø¬Ø§ÙØ§ اسکرÛپت در Ø³Ø§ÛØª Ø®ÙØ¯ Ù
اÙÙØ¯ Prism.js Ø§Ø³ØªÙØ§Ø¯Ù Ø®ÙØ§ÙÛÙ
کرد. Ø¨Ø±Ø§Û Ø¯Ø±ÛØ§Ùت syntax highlighting Ø¨Ø±Ø§Û ÙØ·Ø¹Ù Ø¨Ø§ÙØ§ درprismØ Ú©Ù Prism.highlightElem(pre) ÙØ§Ù
ÛØ¯Ù Ù
ÛâØ´ÙØ¯Ø Ú©Ù Ù
ØØªÙÛØ§Øª ÚÙÛÙ Ø¹ÙØ§ØµØ±preرا Ø¨Ø±Ø±Ø³Û Ù
ÛâÚ©ÙØ¯ ٠تگâÙØ§ ٠سبکâÙØ§Û Ø®Ø§ØµÛ Ø±Ø§ Ø¨Ø±Ø§Û syntax highlighting رÙÚ¯Û Ø¨Ù Ø¢Ù Ø¹ÙØ§ØµØ± اضاÙÙ Ù
ÛâÚ©ÙØ¯Ø Ù
شاب٠آÙÚ٠در اÛÙ ØµÙØÙ Ù
Û Ø¨ÛÙÛØ¯.
دÙÛÙØ§Ù Ú٠زÙ
اÙÛ Ø¨Ø§ÛØ¯ Ø¢Ù Ø±ÙØ´ Ø¨Ø±Ø¬Ø³ØªÙ Ø³Ø§Ø²Û Ø±Ø§ اجرا Ú©ÙÛÙ
Ø Ø®ÙØ¨Ø Ù
ÛâØªÙØ§ÙÛÙ
اÛ٠کار را در رÙÛØ¯Ø§Ø¯ DOMContentLoaded Ø§ÙØ¬Ø§Ù
دÙÛÙ
ÛØ§ اسکرÛپت را در پاÛÛÙ ØµÙØÙ ÙØ±Ø§Ø± دÙÛÙ
. ÙØØ¸ÙâØ§Û Ú©Ù DOM Ù
ا Ø¢Ù
Ø§Ø¯Ù Ø§Ø³ØªØ Ù
ÛâØªÙØ§ÙÛÙ
Ø¹ÙØ§ØµØ± pre[class*="language"] را جستج٠کÙÛÙ
٠رÙÛ Ø¢ÙÙØ§ Prism.highlightElem را صدا Ú©ÙÛÙ
:
// highlight all code snippets on the page
document.querySelectorAll('pre[class*="language"]').forEach(Prism.highlightElem);
ØØ§Ùا Ø¨ÛØ§ÛÛØ¯ ادا٠٠دÙÛÙ . ÙØ±Ø¶ Ú©ÙÛØ¯ Ù Û Ø®ÙØ§ÙÛÙ Ù Ø·Ø§ÙØ¨ را Ø¨Ù ØµÙØ±Øª Ù¾ÙÛØ§ از ÛÚ© Ø³Ø±ÙØ± ÙØ§Ú©Ø´Û Ú©ÙÛÙ . ٠ا Ø±ÙØ´âÙØ§ÛÛ Ø±Ø§ Ø¨Ø±Ø§Û Ø¢Ù Ù Ø·Ø§ÙØ¹Ù Ø®ÙØ§ÙÛ٠کرد later in the tutorial. در ØØ§Ù ØØ§Ø¶Ø± ÙÙØ· Ù Ù٠است Ú©Ù ÛÚ© Ù ÙØ§ÙÙ HTML را از ÛÚ© ÙØ¨ Ø³Ø±ÙØ± ÙØ§Ú©Ø´Û Ú©ÙÛ٠٠آ٠را در ØµÙØ±Øª Ø¯Ø±Ø®ÙØ§Ø³Øª ÙÙ Ø§ÛØ´ دÙÛÙ :
let article = /* fetch new content from server */
articleElem.innerHTML = article;
در HTML article Ø¬Ø¯ÛØ¯ Ù
Ù
ک٠است ØØ§ÙÛ Ú©Ø¯ÙØ§ÛÛ Ø¨Ø§Ø´Ø¯. Ø¨Ø§ÛØ¯Prism.highlightElem را رÙÛ Ø¢ÙÙØ§ صدا Ú©ÙÛÙ
Ø Ø¯Ø± ØºÛØ± اÛÙ ØµÙØ±Øª برجست٠ÙÙ
ÛâØ´ÙÙØ¯.
کجا Ù Ú٠زÙ
اÙÛ Ø¨Ø±Ø§Û ÛÚ© Ù
ÙØ§ÙÙ Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø´Ø¯Ù Ù¾ÙÛØ§ با Prism.highlightElem تÙ
اس Ø¨Ú¯ÛØ±ÛدØ
Ù ÛâØªÙØ§ÙÛÙ Ø¢Ù ÙØ±Ø§Ø®Ùا٠را Ø¨Ù Ú©Ø¯Û Ú©Ù ÛÚ© Ù ÙØ§Ù٠را Ø¨Ø§Ø±Ú¯ÛØ±Û Ù ÛâÚ©ÙØ¯Ø اضاÙÙ Ú©ÙÛÙ Ø Ù Ø§ÙÙØ¯ اÛÙ:
let article = /* fetch new content from server */
articleElem.innerHTML = article;
let snippets = articleElem.querySelectorAll('pre[class*="language-"]');
snippets.forEach(Prism.highlightElem);
â¦Ø§Ù Ø§Ø ØªØµÙØ± Ú©ÙÛØ¯ اگر ٠ا Ù Ú©Ø§Ù ÙØ§Û Ø²ÛØ§Ø¯Û در کد داشت٠باشÛ٠ک٠در Ø¢Ù Ù ØØªÙØ§Û Ø®ÙØ¯ را Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ù Û Ú©ÙÛÙ â Ù ÙØ§ÙØ§ØªØ Ø¢Ø²Ù ÙÙ ÙØ§Ø پست ÙØ§Û Ø§ÙØ¬Ù Ù Ù ØºÛØ±Ù. اÛÙ Ø®ÛÙÛ Ø±Ø§ØØª ÙÛØ³Øª.
٠اگر Ù ØØªÙا ØªÙØ³Ø· ÛÚ© ٠اÚÙ٠شخص Ø«Ø§ÙØ« Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø´ÙØ¯ ÚÙØ ب٠عÙÙØ§Ù Ù Ø«Ø§ÙØ ٠ا ÛÚ© Ø§ÙØ¬Ù ٠دارÛÙ Ú©Ù ØªÙØ³Ø· شخص دÛÚ¯Ø±Û ÙÙØ´ØªÙ Ø´Ø¯Ù Ø§Ø³ØªØ Ú©Ù Ù ØØªÙا را Ø¨Ù ØµÙØ±Øª Ù¾ÙÛØ§ Ø¨Ø§Ø±Ú¯ÛØ±Û Ù Û Ú©ÙØ¯Ø ٠٠اÛÙÛÙ Ø¨Ø±Ø¬Ø³ØªÙ Ø³Ø§Ø²Û ÙØÙÛ Ø±Ø§ ب٠آ٠اضاÙÙ Ú©ÙÛÙ . ÙÛÚ Ú©Ø³ ÙØµÙ٠اسکرÛپت ÙØ§Û شخص Ø«Ø§ÙØ« را Ø¯ÙØ³Øª ÙØ¯Ø§Ø±Ø¯.
Ø®ÙØ´Ø¨Ø®ØªØ§ÙÙØ گزÛÙ٠دÛÚ¯Ø±Û ÙØ¬Ùد دارد.
Ù
ÛâØªÙØ§ÙÛÙ
از MutationObserver Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
تا بÙâØ·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± زÙ
اÙÛ Ú©Ù ÙØ·Ø¹ÙâÙØ§Û کد در ØµÙØÙ Ø¯Ø±Ø¬ Ù
ÛâØ´ÙÙØ¯Ø Ø´ÙØ§Ø³Ø§ÛÛ Ú©Ø±Ø¯Ù Ù Ø¢ÙâÙØ§ را برجست٠کÙÛÙ
.
Ø¨ÙØ§Ø¨Ø±Ø§Û٠٠ا ع٠Ùکرد Ø¨Ø±Ø¬Ø³ØªÙ Ø³Ø§Ø²Û Ø±Ø§ در ÛÚ© Ù Ú©Ø§Ù Ù Ø¯ÛØ±Ûت Ù Û Ú©ÙÛ٠٠٠ا را از ÙÛØ§Ø² Ø¨Ù Ø§Ø¯ØºØ§Ù Ø¢Ù Ø±ÙØ§ Ù Û Ú©ÙÛÙ .
داÛÙØ§Ù ÛÚ© highlight demo
٠٠ثاÙÛ Ú©Ù Ú©Ø§Ø± Ù Û Ú©ÙØ¯.
اگر اÛ٠کد را اجرا Ú©ÙÛØ¯Ø Ø´Ø±ÙØ¹ Ø¨Ù Ù Ø´Ø§ÙØ¯Ù element Ø²ÛØ± Ù Û Ú©ÙØ¯ Ù ÙØ± ÙØ·Ø¹Ù Ú©Ø¯Û Ø±Ø§ ک٠در Ø¢ÙØ¬Ø§ Ø¸Ø§ÙØ± Ù Û Ø´ÙØ¯ Ø¨Ø±Ø¬Ø³ØªÙ Ù Û Ú©ÙØ¯:
let observer = new MutationObserver(mutations => {
for(let mutation of mutations) {
// examine new nodes, is there anything to highlight?
for(let node of mutation.addedNodes) {
// we track only elements, skip other nodes (e.g. text nodes)
if (!(node instanceof HTMLElement)) continue;
// check the inserted element for being a code snippet
if (node.matches('pre[class*="language-"]')) {
Prism.highlightElement(node);
}
// or maybe there's a code snippet somewhere in its subtree?
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 Ù Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت ÙØ¬Ùد دارد Ú©Ù Ø¨Ù ØµÙØ±Øª Ù¾ÙÛØ§ با Ø§Ø³ØªÙØ§Ø¯Ù از innerHTML آ٠را پر Ù
Û Ú©ÙØ¯.
ÙØ·Ùا کد ÙØ¨ÙÛ Ø±Ø§ اجرا Ú©ÙÛØ¯ (در Ø¨Ø§ÙØ§Ø Ø¢Ù Ø¹ÙØµØ± را Ù
Ø´Ø§ÙØ¯Ù Ú©ÙÛØ¯)Ø Ù Ø³Ù¾Ø³ کد Ø²ÛØ± را اجرا Ú©ÙÛØ¯. Ø®ÙØ§ÙÛØ¯ Ø¯ÛØ¯ Ú©Ù ÚÚ¯ÙÙÙ MutationObserver ÙØ·Ø¹Ù را Ø´ÙØ§Ø³Ø§ÛÛ Ù Ø¨Ø±Ø¬Ø³ØªÙ Ù
Û Ú©ÙØ¯.
ÛÚ© Ø¹ÙØµØ± آزÙ
Ø§ÛØ´Û با id="highlight-demo"Ø Ú©Ø¯ Ø¨Ø§ÙØ§ را اجرا Ú©ÙÛØ¯ تا آ٠را Ù
Ø´Ø§ÙØ¯Ù Ú©ÙÛØ¯. p>
کد Ø²ÛØ± innerHTML Ø®ÙØ¯ را پر Ù
Û Ú©ÙØ¯Ø ک٠باعث Ù
Û Ø´ÙØ¯MutationObserver ÙØ§Ú©ÙØ´ ÙØ´Ø§Ù داد٠٠Ù
ØØªÙØ§Û Ø¢Ù Ø±Ø§ Ø¨Ø±Ø¬Ø³ØªÙ Ú©ÙØ¯:
let demoElem = document.getElementById('highlight-demo');
// dynamically insert content with code snippets
demoElem.innerHTML = `A code snippet is below:
<pre class="language-javascript"><code> let hello = "world!"; </code></pre>
<div>Another one:</div>
<div>
<pre class="language-css"><code>.class { margin: 5px; } </code></pre>
</div>
`;
اکÙÙÙ MutationObserver را دارÛÙ
Ú©Ù Ù
Û ØªÙØ§Ùد تÙ
اÙ
Ø¨Ø±Ø¬Ø³ØªÙ Ø³Ø§Ø²Û ÙØ§ در Ø¹ÙØ§ØµØ± Ù
Ø´Ø§ÙØ¯Ù Ø´Ø¯Ù ÛØ§ Ú©Ù document را Ø±Ø¯ÛØ§Ø¨Û Ú©ÙØ¯. Ù
ا Ù
ÛâØªÙØ§ÙÛÙ
تکÙâÙØ§Û کد را بدÙÙ Ùکر کرد٠در HTML اضاÙÙ ÛØ§ ØØ°Ù Ú©ÙÛÙ
.
٠تد ÙØ§Û اضاÙÙ
Ø±ÙØ´Û Ø¨Ø±Ø§Û ØªÙÙÙ Ù Ø´Ø§ÙØ¯Ù Ú¯Ø±Ù ÙØ¬Ùد دارد:
observer.disconnect()â Ù Ø´Ø§ÙØ¯Ù را ٠تÙÙÙ Ù Û Ú©ÙØ¯.
ÙÙØªÛ Ù Ø´Ø§ÙØ¯Ù را ٠تÙÙÙ Ù Û Ú©ÙÛÙ Ø Ù Ù Ú©Ù Ø§Ø³Øª Ø¨Ø±Ø®Û Ø§Ø² تغÛÛØ±Ø§Øª ÙÙÙØ² ØªÙØ³Ø· ÙØ§Ø¸Ø± پردازش ÙØ´Ø¯Ù باشد. در ÚÙÛÙ Ù ÙØ§Ø±Ø¯Û Ø§Ø³ØªÙØ§Ø¯Ù Ù Û Ú©ÙÛÙ
-observer.takeRecords() â ÙÛØ³ØªÛ از Ø³ÙØ§Ø¨Ù Ø¬ÙØ´ پردازش ÙØ´Ø¯Ù را Ø¯Ø±ÛØ§Ùت Ù
Û Ú©ÙØ¯ â Ù
ÙØ§Ø±Ø¯Û Ú©Ù Ø§ØªÙØ§Ù Ø§ÙØªØ§Ø¯Ù Ø§ÙØ¯Ø اÙ
ا پاسخ تÙ
اس Ø¢ÙÙØ§ را Ù
Ø¯ÛØ±Ûت Ùکرد٠است.
اÛÙ Ø±ÙØ´ ÙØ§ را Ù Û ØªÙØ§Ù با ÙÙ Ø§Ø³ØªÙØ§Ø¯Ù Ú©Ø±Ø¯Ø Ù Ø§ÙÙØ¯:
// get a list of unprocessed mutations
// should be called before disconnecting,
// if you care about possibly unhandled recent mutations
let mutationRecords = observer.takeRecords();
// stop tracking changes
observer.disconnect();
...
``` پس smart header=âØ³ÙØ§Ø¨Ù Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯Ù Ø´Ø¯Ù ØªÙØ³Ø· observer.takeRecords() از ص٠پردازش ØØ°Ù Ù
Û Ø´ÙÙØ¯â
تÙ
اس Ø¨Ø±Ú¯Ø´ØªÛ Ø¨Ø±Ø§Û Ø±Ú©ÙØ±Ø¯Ùا Ú©Ù ØªÙØ³Ø· âobserver.takeRecords()â Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯Ù Ø´Ø¯Ù Ø§Ø³ØªØ ÙØ±Ø§Ø®ÙاÙÛ ÙÙ
Û Ø´ÙØ¯.
```smart header="تعاÙ
٠جÙ
ع Ø¢ÙØ±Û زباÙÙ"
ÙØ§Ø¸Ø±Ø§Ù از ارجاعات ضعÛÙ Ø¨Ù Ú¯Ø±Ù ÙØ§ در Ø¯Ø§Ø®Ù Ø§Ø³ØªÙØ§Ø¯Ù Ù
Û Ú©ÙÙØ¯. ب٠اÛÙ Ù
Ø¹ÙØ§ ک٠اگر ÛÚ© گر٠از DOM ØØ°Ù Ø´ÙØ¯ Ù ØºÛØ±ÙØ§Ø¨Ù Ø¯Ø³ØªØ±Ø³Û Ø´ÙØ¯Ø Ù
ÛâØªÙØ§Ù زباÙÙâÙØ§ را جÙ
Ø¹âØ¢ÙØ±Û کرد.
صر٠اÛÙ ÙØ§ÙØ¹ÛØª Ú©Ù ÛÚ© گر٠DOM Ù
Ø´Ø§ÙØ¯Ù Ù
Û Ø´ÙØ¯ Ù
Ø§ÙØ¹ از جÙ
ع Ø¢ÙØ±Û زباÙÙ ÙÙ
Û Ø´ÙØ¯.
Ø®ÙØ§ØµÙ
پسMutationObserver Ù
Û ØªÙØ§Ùد ب٠تغÛÛØ±Ø§Øª در DOM â ÙÛÚÚ¯Û ÙØ§Ø Ù
ØØªÙØ§Û Ù
ØªÙ Ù Ø§ÙØ²ÙدÙ/ØØ°Ù Ø¹ÙØ§ØµØ± ÙØ§Ú©ÙØ´ ÙØ´Ø§Ù Ø¯ÙØ¯.
٠ا Ù ÛâØªÙØ§ÙÛ٠از Ø¢Ù Ø¨Ø±Ø§Û Ø±Ø¯ÛØ§Ø¨Û تغÛÛØ±Ø§Øª Ø§ÛØ¬Ø§Ø¯ Ø´Ø¯Ù ØªÙØ³Ø· بخشâÙØ§Û دÛگر کد٠ا٠٠ÙÙ ÚÙÛÙ Ø¨Ø±Ø§Û Ø§Ø¯ØºØ§Ù Ø¨Ø§ اسکرÛپتâÙØ§Û شخص Ø«Ø§ÙØ« Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ .
ÙÙ
ÚÙÛÙ MutationObserver Ù
Û ØªÙØ§Ùد ÙØ± تغÛÛØ±Û را Ø±Ø¯ÛØ§Ø¨Û Ú©ÙØ¯. ØªÙØ¸ÛÙ
ات âÚÙ ÚÛØ²Û را Ù
Ø´Ø§ÙØ¯Ù Ú©ÙÛÙ
â Ø¨Ø±Ø§Û بÙÛÙÙ Ø³Ø§Ø²Û Ø§Ø³ØªÙØ§Ø¯Ù Ù
Û Ø´ÙØ¯Ø ÙÙ Ø¨Ø±Ø§Û ØµØ±Ù Ù
ÙØ§Ø¨Ø¹ در ÙØ±Ø§Ø®ÙاÙÛ ÙØ§Û ØºÛØ± Ø¶Ø±ÙØ±Û.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)