成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

MutationObserver的核心特性

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

實驗驗證

以下代碼片段展示了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é)點${i}; `;
    root.append(text);
    console.log('已添加: ' + text);
}

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

運行結(jié)果分析:

圖片圖片

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

實際應(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)容添加時進行處理。

結(jié)語

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

責任編輯:武曉燕 來源: 大遷世界
相關(guān)推薦

2010-08-26 14:23:28

路由器故障

2019-08-29 07:35:29

網(wǎng)站404空白nginx

2009-10-20 16:48:30

C#委托

2020-08-28 10:21:24

Go代碼程序

2010-02-26 15:46:48

Silverlight

2011-08-29 15:58:58

2023-10-06 12:15:02

2023-07-07 00:54:05

2009-08-21 11:24:16

C#異步調(diào)用

2020-10-29 08:31:15

Java同步回調(diào)編程語言

2020-03-11 09:15:25

微信asyncawait

2022-05-19 08:01:49

PostgreSQL數(shù)據(jù)庫

2018-01-28 20:39:39

戴爾

2011-08-30 10:20:41

Silverlight

2011-05-04 09:25:35

打印機

2022-04-22 10:30:07

框架JavaScript前端

2021-01-28 11:40:34

Dubbo異步配置

2009-06-17 11:47:21

Hibernate 刪

2021-11-16 07:02:05

函數(shù)Python返回值

2014-03-24 10:54:10

大數(shù)據(jù)分析
點贊
收藏

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

主站蜘蛛池模板: 日韩精品久久 | 日本精品一区 | 欧美激情一区二区 | 亚洲成人自拍 | 国产精品久久久久久久午夜 | 国产日韩欧美中文字幕 | 男女深夜网站 | 国产女人与拘做受免费视频 | 亚洲欧洲视频 | 嫩草网 | 岛国av一区二区三区 | 久久国产欧美日韩精品 | 狠狠亚洲 | 国产免费看 | 久久九九99 | 亚洲精品视频在线观看免费 | 免费1区2区3区 | 国产精品久久精品 | 国产偷久久一级精品60部 | 精品国产一级 | 成人免费一区二区三区牛牛 | 在线免费观看成人 | 澳门永久av免费网站 | 在线观看亚 | 一区二区av| 国产福利精品一区 | 成人性视频免费网站 | 成人av免费在线观看 | 日本三级全黄三级a | 亚洲免费在线 | 精品视频一区二区三区在线观看 | 性欧美精品一区二区三区在线播放 | 日韩欧美在线观看 | 国产日韩精品一区 | 亚洲一区视频在线播放 | av大片在线观看 | 国产精品一区二区在线 | 91精品在线播放 | 韩日有码 | 精品久久久久久久久久久下田 | 一区视频在线免费观看 |