Mutation Observer API 用來監視DOM變更。DOM的任何變更,好比節點的增刪、屬性的變更、文本內容的變化,這個API均可以獲得通知。數組
首先這個API歸屬於微任務,也就是說是異步的,這樣設計也是爲了應付Dom變更頻繁的特色,防止頻繁變更佔用js執行棧形成頁面卡頓。好比說:若是不是異步當DOM變更觸發觀察者的回調函數執行,就會堵塞後續代碼的執行;是異步的話,在響應時間內好比說插入1000個p元素,那麼MutationObserver會把這些響應合併成一次。markdown
早期的Firefox和Chrome版本中須要帶有前綴。app
var MutationObserver = window.MutationObserver || window.WebkitMutationObserver || window.MozMutationObserver;
複製代碼
首先使用MutationObserver構造函數實例化一個MutationObserver對象,同時指定這個實例的回調函數。異步
const observer = new MutationObserver(()=>{})
複製代碼
構造函數能夠接受兩個參數:函數
const observer = new MutationObserver((mutations,observer) => {
console.log(muatation,observer);
})
複製代碼
構造函數調用MutationObserver獲得MutationObserver實例。實例有如下方法。oop
observe方法用來監聽Dom變化,接受兩個參數:性能
observer.observe(document.documentElement,{
})
複製代碼
Dom的變更類型一共有三種:ui
當變更類型爲true的時候爲監聽狀態,默認爲不監聽。url
須要注意的是:必須同時指定三種變更類型中的一種或者多種,不然會報錯。spa
除了三種變更類型外,對象屬性還能夠設置其餘值:
observer.observe(document.documentElement,{
childList : true,
attributes : true,
characterData : true,
subtree : true,
attributeOldValue: true,
characterDataOldValue: true,
})
複製代碼
taskRecoreds方法用於清楚變更記錄,即再也不處理未處理的變更。該方法返回變更記錄的數組。
const changes = observer.taskRecords();
console.log(changes);
複製代碼
disconnect方法用來中止觀察。調用該方法後,DOM再發生變更,也不會觸發觀察者對象。
observer.disconnect();
複製代碼
DOM每次發生變化,就會生成一條變更記錄(MutationRecord實例)。該實例包含了與變更相關的全部信息。MutationObserver處理的就是一個個MutationRecord實例組成的數組。
MutationRecord包含了Dom的有關信息,有如下屬性:
MutationObserver是異步操做,屬於微任務,在Vue源碼中實現nextTick
的調度機制使用到了這個。 Vue中主要起到一個實現異步操做的調度機制,並無真正體現到監聽Dom變化的特色。
我我的這個東西在監聽Dom變化上仍是有大做用的。咱們在作性能監控的時候,一般會檢測一些性能指標,例如:FP、FCP、FMP
這些性能指標。FMP
的標準定義不明確,一般是指Dom活動最大的時刻。因此說FMP
比較難檢測,一般採用body先後打mark
的方式檢測。使用這個API的話,能夠檢測哪一個時間段Dom到文本中最多,也就能夠說成活動最大。
這是Can I Use上的MutationObserver API的支持度。