JavaScript MutationObserver實(shí)例講解
前言
為什么突然寫MutationObserver呢?最近在寫頁面水印的時(shí)候用到了MutationObserver方法,兩者之間有什么聯(lián)系呢?不用MutationObserver情況下,使用網(wǎng)站的人員可以隨意修改DOM就可以把系統(tǒng)作者的版權(quán)標(biāo)識(水?。┤サ簦缓笫褂脽o水印的網(wǎng)站,這顯然是違背了系統(tǒng)作者的意愿,那么怎么防止這一操作呢?當(dāng)然是MutationObserver,它能夠監(jiān)聽DOM的變化,根據(jù)DOM的變化然后做出相應(yīng)操作,比如刪除水印后,使用MutationObserver監(jiān)聽到了水印的DOM被刪除,就會(huì)立即生成一個(gè)水印,這樣就杜絕了上面的情況。
一、MutationObserver
MutationObserver構(gòu)造函數(shù)用來監(jiān)聽DOM的變化,比如節(jié)點(diǎn)增加、刪除,屬性的改變,文本的變動(dòng)都能監(jiān)聽到。它具有以下特點(diǎn):
- 等所有dom操作結(jié)束后才觸發(fā),可以看成異步
- 會(huì)把dom的變化記錄放到數(shù)組中進(jìn)行處理
- 可以監(jiān)聽所有類型的dom變化,也能指定類型監(jiān)聽
用MutationObserver創(chuàng)建一個(gè)createObserve實(shí)例, 它會(huì)在指定的 DOM 發(fā)生變化時(shí)被調(diào)用。其中MutationObserver構(gòu)造函數(shù)中有兩個(gè)參數(shù)。
- mutationRecoard:存放所有dom變化的數(shù)組
- observe:觀察者實(shí)例
const createObserve = new MutationObserver((mutationRecoard,observe)=>{
})
MutationRecoard監(jiān)聽記錄詳情
dom每次變化都會(huì)記錄在MutationRecoard中,所以它是一個(gè)數(shù)組類型,MutationRecoard記錄了每次DOM變化時(shí)的詳細(xì)信息,具體如下所示:
| 屬性 | 含義 |
|---|---|
| type | 觀察的變動(dòng)類型(attribute、characterData或者childList) |
| target | 發(fā)生變動(dòng)的DOM節(jié)點(diǎn) |
| addedNodes | 新增的DOM節(jié)點(diǎn) |
| removedNodes | 刪除的DOM節(jié)點(diǎn) |
| previousSibling | 前一個(gè)同級節(jié)點(diǎn),如果沒有則返回null |
| nextSibling | 下一個(gè)同級節(jié)點(diǎn),如果沒有則返回null |
| attributeName | 發(fā)生變動(dòng)的屬性。如果設(shè)置了attributeFilter,則只返回預(yù)先指定的屬性 |
| oldValue | 變動(dòng)前的值。這個(gè)屬性只對attribute和characterData變動(dòng)有效,如果發(fā)生childList變動(dòng),則返回null |
具體如下圖所示:

二、MutationObserver實(shí)例對象方法
1. observe(node,config)
配置 MutationObserver 在 DOM 更改匹配給定選項(xiàng)時(shí),通過其回調(diào)函數(shù)開始接收通知。有兩個(gè)參數(shù):
- node:觀察元素的所有節(jié)點(diǎn)
- config:配置項(xiàng),可以觀測指定配置項(xiàng)的變化
配置項(xiàng)的詳細(xì)屬性如下:
| 屬性 | 含義 |
|---|---|
| childList | 子節(jié)點(diǎn)的變動(dòng)(指新增,刪除或者更改) |
| attributes | 屬性的變動(dòng) |
| characterData | 節(jié)點(diǎn)內(nèi)容或節(jié)點(diǎn)文本的變動(dòng) |
| subtree | 布爾值,表示是否將該觀察器應(yīng)用于該節(jié)點(diǎn)的所有后代節(jié)點(diǎn) |
| attributeOldValue | 布爾值,表示觀察attributes變動(dòng)時(shí),是否需要記錄變動(dòng)前的屬性值 |
| characterDataOldValue | 布爾值,表示觀察characterData變動(dòng)時(shí),是否需要記錄變動(dòng)前的值 |
| attributeFilter | 數(shù)組,表示需要觀察的特定屬性(比如[‘class’,‘src’]) |
2. disconnect()
阻止 MutationObserver 實(shí)例繼續(xù)接收的通知,直到再次調(diào)用其 observe() 方法,該觀察者對象包含的回調(diào)函數(shù)都不會(huì)再被調(diào)用。
3. takeRecords()
從 MutationObserver 的通知隊(duì)列中刪除所有待處理的記錄,并將它們返回到 MutationRecord 對象的新 Array 中。
三、案列
- 創(chuàng)建一個(gè)觀察器并傳入回調(diào)
- 為觀察器配置觀察節(jié)點(diǎn)
- 指定觀察特定配置的dom變化
- 執(zhí)行觀察器回調(diào)
- 獲取到DOM變化記錄
<div class="content"> <ui> <li class="0">0000000</li> <li class="1">1111111</li> <li class="2">222222</li> <li class="3">33333</li> <li class="4">4444</li> <li class="5">55555</li> <li class="6">6666</li> <li class="7">77777</li> <li class="8">888888</li> <li class="9">99999</li> </ui> </div>
// 觀察器的配置(需要觀察什么變動(dòng))
const config = { attributes: true, childList: true, subtree: true,characterData:true,characterDataOldValue:true,attributDataOldValue:true};
// 當(dāng)觀察到變動(dòng)時(shí)執(zhí)行的回調(diào)函數(shù)
const callback = function(mutationRecoard, observer) {
// Use traditional 'for loops' for IE 11
for(let mutation of mutationRecoard) {
if (mutation.type === 'childList') {
console.log('A child node has been added or removed.');
}
else if (mutation.type === 'attributes') {
console.log('The ' + mutation.attributeName + ' attribute was modified.');
}
}
};
// 創(chuàng)建一個(gè)觀察器實(shí)例并傳入回調(diào)函數(shù)
const observer = new MutationObserver(callback);
// 以上述配置開始觀察目標(biāo)節(jié)點(diǎn)
observer.observe(document.getElementsByClassName('content')[0], config);
// 之后,可停止觀察
observer.disconnect();到此這篇關(guān)于JavaScript MutationObserver實(shí)例講解的文章就介紹到這了,更多相關(guān)JS MutationObserver內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序+騰訊地圖開發(fā)實(shí)現(xiàn)路徑規(guī)劃繪制
這篇文章主要介紹了微信小程序+騰訊地圖開發(fā)實(shí)現(xiàn)路徑規(guī)劃繪制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
easyui tree帶checkbox實(shí)現(xiàn)單選的簡單實(shí)例
下面小編就為大家?guī)硪黄猠asyui tree帶checkbox實(shí)現(xiàn)單選的簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11
JavaScript中call,apply,bind的區(qū)別與實(shí)現(xiàn)
這篇文章主要介紹了JavaScript中call,apply,bind的區(qū)別與實(shí)現(xiàn),文章通過圍繞主題思想展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
JavaScript函數(shù)apply()和call()用法與異同分析
這篇文章主要介紹了JavaScript函數(shù)apply()和call()用法與異同,結(jié)合實(shí)例形式分析了apply()和call()的功能、區(qū)別、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-08-08
electron-builder允許安裝時(shí)請求提升權(quán)限的場景分析
electron-builder 作為一個(gè)用于 Electron 應(yīng)用程序打包的工具,需要下載并使用 Electron 運(yùn)行時(shí)來創(chuàng)建可執(zhí)行文件,這篇文章給大家介紹electron-builder允許安裝時(shí)請求提升權(quán)限的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧2024-03-03
JS使用Date對象實(shí)時(shí)顯示當(dāng)前系統(tǒng)時(shí)間簡單示例
這篇文章主要介紹了JS使用Date對象實(shí)時(shí)顯示當(dāng)前系統(tǒng)時(shí)間,涉及javascript基于定時(shí)器動(dòng)態(tài)操作Date對象相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-08-08
TypeScript類型系統(tǒng)自定義數(shù)據(jù)類型教程示例
這篇文章主要為大家介紹了TypeScript類型系統(tǒng)自定義數(shù)據(jù)類型教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11

