自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MutationObserver 回調(diào)是作為任務(wù)或微任務(wù)同步或異步調(diào)用的?如果出現(xiàn)異常怎么辦?

開發(fā) 前端
MutationObserver提供了一種強(qiáng)大而高效的方式來監(jiān)控DOM變化。了解其作為微任務(wù)執(zhí)行、變更合并和異常處理的特性,可以幫助開發(fā)者更好地設(shè)計(jì)和實(shí)現(xiàn)DOM監(jiān)控邏輯。在實(shí)際應(yīng)用中,合理利用這些特性可以優(yōu)化性能,并實(shí)現(xiàn)更復(fù)雜的DOM交互功能。

在前端開發(fā)中,監(jiān)控DOM變化是一項(xiàng)常見需求,無論是用于模擬用戶操作還是動態(tài)調(diào)整頁面內(nèi)容。隨著Chrome 127移除了傳統(tǒng)的mutation事件(如DOMNodeInserted和DOMNodeRemoved),MutationObserver成為了DOM監(jiān)控的首選API。本文將深入探討MutationObserver的工作機(jī)制,特別關(guān)注其回調(diào)執(zhí)行的時(shí)機(jī)和異常處理方式。

MutationObserver的核心特性

  1. 異步回調(diào):MutationObserver的回調(diào)是作為微任務(wù)(microtask)執(zhí)行的。
  2. 變更合并:多個同步DOM變更會被合并到一個回調(diào)中處理。
  3. 異常處理:回調(diào)中拋出的異常不會中斷觀察者的運(yùn)行。

實(shí)驗(yàn)驗(yàn)證

以下代碼片段展示了MutationObserver的關(guān)鍵行為:

function callback(mutations) {
    console.log('變更:', mutations.flatMap(m => [...m.addedNodes].map(n => n.nodeValue)));
    throw '回調(diào)中的異常';
}

const observer = new MutationObserver(callback);
observer.observe(root, { childList: true });

setTimeout(() => console.log('前置宏任務(wù)'));
Promise.resolve().then(() => console.log('前置微任務(wù)'));

for (let i = 0; i < 3; i++) {
    const text = `節(jié)點(diǎn)${i}; `;
    root.append(text);
    console.log('已添加: ' + text);
}

setTimeout(() => console.log('后置宏任務(wù)'));
Promise.resolve().then(() => console.log('后置微任務(wù)'));

運(yùn)行結(jié)果分析:

圖片圖片

  1. 三個同步DOM變更被合并到一個回調(diào)中。
  2. 回調(diào)在兩個預(yù)定的微任務(wù)之間執(zhí)行,證實(shí)其作為普通微任務(wù)的性質(zhì)。
  3. 預(yù)定的宏任務(wù)在微任務(wù)隊(duì)列清空后執(zhí)行。
  4. 回調(diào)中拋出的異常不影響后續(xù)操作。

實(shí)際應(yīng)用示例

考慮一個動態(tài)加載內(nèi)容的網(wǎng)頁場景:

function contentObserver(mutations) {
    for (let mutation of mutations) {
        if (mutation.type === 'childList') {
            mutation.addedNodes.forEach(node => {
                if (node.nodeType === Node.ELEMENT_NODE && node.classList.contains('dynamic-content')) {
                    processNewContent(node);
                }
            });
        }
    }
}

const observer = new MutationObserver(contentObserver);
observer.observe(document.body, { childList: true, subtree: true });

function processNewContent(node) {
    // 處理新加載的內(nèi)容
    console.log('處理新內(nèi)容:', node);
}

// 模擬動態(tài)加載內(nèi)容
setTimeout(() => {
    const newContent = document.createElement('div');
    newContent.classList.add('dynamic-content');
    newContent.textContent = '新加載的內(nèi)容';
    document.body.appendChild(newContent);
}, 1000);

這個例子展示了如何使用MutationObserver監(jiān)控動態(tài)加載的內(nèi)容,并在新內(nèi)容添加時(shí)進(jìn)行處理。

結(jié)語

MutationObserver提供了一種強(qiáng)大而高效的方式來監(jiān)控DOM變化。了解其作為微任務(wù)執(zhí)行、變更合并和異常處理的特性,可以幫助開發(fā)者更好地設(shè)計(jì)和實(shí)現(xiàn)DOM監(jiān)控邏輯。在實(shí)際應(yīng)用中,合理利用這些特性可以優(yōu)化性能,并實(shí)現(xiàn)更復(fù)雜的DOM交互功能。

責(zé)任編輯:武曉燕 來源: 大遷世界
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號