欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript MutationObserver實例講解

 更新時間:2022年12月13日 10:45:20   作者:不叫貓先生  
MutationObserver用來監(jiān)視DOM變動。DOM的任何變動,比如節(jié)點增減、屬性的變動、文本內容的變動都會觸發(fā)MutationObserver事件,它與事件有一個本質不同:事件是同步觸發(fā),MutationObserver則是異步觸發(fā),DOM的變動并不會馬上觸發(fā),而是要等到當前所有DOM操作都結束才觸發(fā)

前言

為什么突然寫MutationObserver呢?最近在寫頁面水印的時候用到了MutationObserver方法,兩者之間有什么聯系呢?不用MutationObserver情況下,使用網站的人員可以隨意修改DOM就可以把系統(tǒng)作者的版權標識(水印)去掉,然后使用無水印的網站,這顯然是違背了系統(tǒng)作者的意愿,那么怎么防止這一操作呢?當然是MutationObserver,它能夠監(jiān)聽DOM的變化,根據DOM的變化然后做出相應操作,比如刪除水印后,使用MutationObserver監(jiān)聽到了水印的DOM被刪除,就會立即生成一個水印,這樣就杜絕了上面的情況。

一、MutationObserver

MutationObserver構造函數用來監(jiān)聽DOM的變化,比如節(jié)點增加、刪除,屬性的改變,文本的變動都能監(jiān)聽到。它具有以下特點:

  • 等所有dom操作結束后才觸發(fā),可以看成異步
  • 會把dom的變化記錄放到數組中進行處理
  • 可以監(jiān)聽所有類型的dom變化,也能指定類型監(jiān)聽

用MutationObserver創(chuàng)建一個createObserve實例, 它會在指定的 DOM 發(fā)生變化時被調用。其中MutationObserver構造函數中有兩個參數。

  • mutationRecoard:存放所有dom變化的數組
  • observe:觀察者實例
const createObserve = new MutationObserver((mutationRecoard,observe)=>{
})

MutationRecoard監(jiān)聽記錄詳情

dom每次變化都會記錄在MutationRecoard中,所以它是一個數組類型,MutationRecoard記錄了每次DOM變化時的詳細信息,具體如下所示:

屬性含義
type觀察的變動類型(attribute、characterData或者childList)
target發(fā)生變動的DOM節(jié)點
addedNodes新增的DOM節(jié)點
removedNodes刪除的DOM節(jié)點
previousSibling前一個同級節(jié)點,如果沒有則返回null
nextSibling下一個同級節(jié)點,如果沒有則返回null
attributeName發(fā)生變動的屬性。如果設置了attributeFilter,則只返回預先指定的屬性
oldValue變動前的值。這個屬性只對attribute和characterData變動有效,如果發(fā)生childList變動,則返回null

具體如下圖所示:

二、MutationObserver實例對象方法

1. observe(node,config)

配置 MutationObserver 在 DOM 更改匹配給定選項時,通過其回調函數開始接收通知。有兩個參數:

  • node:觀察元素的所有節(jié)點
  • config:配置項,可以觀測指定配置項的變化

配置項的詳細屬性如下:

屬性含義
childList子節(jié)點的變動(指新增,刪除或者更改)
attributes屬性的變動
characterData節(jié)點內容或節(jié)點文本的變動
subtree布爾值,表示是否將該觀察器應用于該節(jié)點的所有后代節(jié)點
attributeOldValue布爾值,表示觀察attributes變動時,是否需要記錄變動前的屬性值
characterDataOldValue布爾值,表示觀察characterData變動時,是否需要記錄變動前的值
attributeFilter數組,表示需要觀察的特定屬性(比如[‘class’,‘src’])

2. disconnect()

阻止 MutationObserver 實例繼續(xù)接收的通知,直到再次調用其 observe() 方法,該觀察者對象包含的回調函數都不會再被調用。

3. takeRecords()

從 MutationObserver 的通知隊列中刪除所有待處理的記錄,并將它們返回到 MutationRecord 對象的新 Array 中。

三、案列

  • 創(chuàng)建一個觀察器并傳入回調
  • 為觀察器配置觀察節(jié)點
  • 指定觀察特定配置的dom變化
  • 執(zhí)行觀察器回調
  • 獲取到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>
// 觀察器的配置(需要觀察什么變動)
const config = { attributes: true, childList: true, subtree: true,characterData:true,characterDataOldValue:true,attributDataOldValue:true};
// 當觀察到變動時執(zhí)行的回調函數
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)建一個觀察器實例并傳入回調函數
const observer = new MutationObserver(callback);
// 以上述配置開始觀察目標節(jié)點
observer.observe(document.getElementsByClassName('content')[0], config);
// 之后,可停止觀察
observer.disconnect();

到此這篇關于JavaScript MutationObserver實例講解的文章就介紹到這了,更多相關JS MutationObserver內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 善用事件代理,警惕閉包的性能陷阱。

    善用事件代理,警惕閉包的性能陷阱。

    關于JS性能優(yōu)化中的冰山一角:事件代理、警惕閉包。其實本文有一個文章已經說到,閉包如何產生,閉包的作用;
    2011-01-01
  • 用javascript讀取xml文件讀取節(jié)點數據

    用javascript讀取xml文件讀取節(jié)點數據

    這篇文章主要介紹了用javascript讀取xml文件讀取節(jié)點數據的具體實現,需要的朋友可以參考下
    2014-08-08
  • js淡入淡出的圖片輪播效果代碼分享

    js淡入淡出的圖片輪播效果代碼分享

    這篇文章主要介紹了js淡入淡出的圖片輪播切換特效,圖片可以隨意替換,文中示例代碼介紹的非常詳細,具有一定的參考價值,推薦給大家,感興趣的小伙伴們可以參考一下
    2015-08-08
  • 淺談javascript六種數據類型以及特殊注意點

    淺談javascript六種數據類型以及特殊注意點

    這篇文章主要介紹了javascript六種數據類型以及特殊注意點,有需要的朋友可以參考一下
    2013-12-12
  • 購物車前端開發(fā)(jQuery和bootstrap3)

    購物車前端開發(fā)(jQuery和bootstrap3)

    針對購物車的操作,進行產品數量的增加減少,刪除購物車中產品項,本文使用JQuery1.11和bootstrap3進行購物車開發(fā),感興趣的小伙伴們
    2016-08-08
  • 菜鳥也能搞懂js中typeof與instanceof區(qū)別

    菜鳥也能搞懂js中typeof與instanceof區(qū)別

    instanceof和typeof是兩個運算符,在程序設計中用到,常用來判斷一個變量是否為空,或者是什么類型的,本文就來介紹一下typeof與instanceof區(qū)別,感興趣的可以了解一下
    2021-09-09
  • 微信小程序嵌入騰訊視頻源過程詳解

    微信小程序嵌入騰訊視頻源過程詳解

    這篇文章主要介紹了微信小程序嵌入騰訊視頻源過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • 如何自己實現JavaScript的new操作符

    如何自己實現JavaScript的new操作符

    new大家肯定都不陌生,單身沒有對象的時候就new一個,很方便。那么它在創(chuàng)建實例的時候,具體做了哪些操作呢?今天我們就來一起分析一下。
    2021-04-04
  • 教你使用webpack打包編譯TypeScript代碼

    教你使用webpack打包編譯TypeScript代碼

    TypeScript同樣也可以結合構建工具一起使用,下邊以webpack為例介紹一下如何結合構建工具使用TypeScript,本文分步驟給大家介紹的非常詳細,需要的朋友參考下吧
    2021-06-06
  • JavaScript實現電燈開關小案例

    JavaScript實現電燈開關小案例

    這篇文章主要為大家詳細介紹了JavaScript實現電燈開關小案例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論