日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MutationObserver 监听DOM树变化

發(fā)布時間:2025/5/22 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MutationObserver 监听DOM树变化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1 概述

Mutation observer 是用于代替 Mutation events 作為觀察DOM樹結(jié)構發(fā)生變化時,做出相應處理的API。為什么要使用mutation observer 去代替 mutation events 呢,我們先了解一下mutation events

Mutation Events

Mutation events 是在 DOM3中定義,用于監(jiān)聽DOM樹結(jié)構變化的事件

它簡單的用法如下:

document.getElementById('list').addEventListener("DOMSubtreeModified", function(){ console.log('列表中子元素被修改'); }, false);

Mutation 事件列表

  • DOMAttrModified
  • DOMAttributeNameChanged
  • DOMCharacterDataModified
  • DOMElementNameChanged
  • DOMNodeInserted
  • DOMNodeRemoved
  • DOMNodeInsertedIntoDocument
  • DOMSubtreeModified

其中DOMNodeRemoved,DOMNodeInserted 和 DOMSubtreeModified 分別用于 監(jiān)聽元素子項的刪除,新增,修改(包括刪除和新增),
DOMAttrModified 是監(jiān)聽元素屬性的修改,并且能夠提供具體的修改動作。

Mutation Events遇到的問題
  • 瀏覽器兼容性問題
    IE9不支持Mutation Events
    Webkit內(nèi)核不支持DOMAttrModified特性,
    DOMElementNameChanged和DOMAttributeNameChanged 在Firefox上不被支持。
  • 性能問題
    1.Mutation Events是同步執(zhí)行的,它的每次調(diào)用,都需要從事件隊列中取出事件,執(zhí)行,然后事件隊列中移除,期間需要移動隊列元素。如果事件觸發(fā)的較為頻繁的話,每一次都需要執(zhí)行上面的這些步驟,那么瀏覽器會被拖慢。
    2.Mutation Events本身是事件,所以捕獲是采用的是事件冒泡的形式,如果冒泡捕獲期間又觸發(fā)了其他的MutationEvents的話,很有可能就會導致阻塞Javascript線程,甚至導致瀏覽器崩潰。

Mutation Observer

Mutation Observer 是在DOM4中定義的,用于替代 mutation events 的新API,它的不同于events的是,所有監(jiān)聽操作以及相應處理都是在其他腳本執(zhí)行完成之后異步執(zhí)行的,并且是所以變動觸發(fā)之后,將變得記錄在數(shù)組中,統(tǒng)一進行回調(diào)的,也就是說,當你使用observer監(jiān)聽多個DOM變化時,并且這若干個DOM發(fā)生了變化,那么observer會將變化記錄到變化數(shù)組中,等待一起都結(jié)束了,然后一次性的從變化數(shù)組中執(zhí)行其對應的回調(diào)函數(shù)。

Mutation Observer 的瀏覽器兼容范圍


兼容性

2 方法

構造函數(shù)

用來實例化一個Mutation觀察者對象,其中的參數(shù)是一個回調(diào)函數(shù),它是會在指定的DOM節(jié)點發(fā)送變化后,執(zhí)行的函數(shù),并且會被傳入兩個參數(shù),一個是變化記錄數(shù)組(MutationRecord),另一個是觀察者對象本身

new MutationObserver(function(records, itself){});
observe

在觀察者對象上,注冊需要觀察的DOM節(jié)點,以及相應的參數(shù)

void observe(Node target, optional MutationObserverInit options)

其中的可選參數(shù) MutationObserverInit的屬性如下:

childLIst 觀察目標節(jié)點的子節(jié)點的新增和刪除。
attributes 觀察目標節(jié)點的屬性節(jié)點(新增或刪除了某個屬性,以及某個屬性的屬性值發(fā)生了變化)。
characterData 如果目標節(jié)點為characterData節(jié)點(一種抽象接口,具體可以為文本節(jié)點,注釋節(jié)點,以及處理指令節(jié)點)時,也要觀察該節(jié)點的文本內(nèi)容是否發(fā)生變化
subtree 觀察目標節(jié)點的所有后代節(jié)點(觀察目標節(jié)點所包含的整棵DOM樹上的上述三種節(jié)點變化)
attributeOldValue 在attributes屬性已經(jīng)設為true的前提下, 將發(fā)生變化的屬性節(jié)點之前的屬性值記錄下來(記錄到下面MutationRecord對象的oldValue屬性中)
characterDataOldValue 在characterData屬性已經(jīng)設為true的前提下,將發(fā)生變化characterData節(jié)點之前的文本內(nèi)容記錄下來(記錄到下面MutationRecord對象的oldValue屬性中)
attributeFilter 一個屬性名數(shù)組(不需要指定命名空間),只有該數(shù)組中包含的屬性名發(fā)生變化時才會被觀察到,其他名稱的屬性發(fā)生變化后會被忽略想要設置那些刪選參數(shù)的話,

如果想要使用哪個參數(shù)的話,就將其值設定為true

disconnect

暫定在觀察者對象上設置的節(jié)點的變化監(jiān)聽,直到重新調(diào)用observe方法

takeRecords

在觀察者對象上調(diào)用takeRecords 會返回 其觀察節(jié)點上的變化記錄(MutationRecord)數(shù)組
其中MutationRecord數(shù)組也會作為,觀察者初始化時的回調(diào)函數(shù)的第一個參數(shù)
其包含的屬性如下:

type 如果是屬性發(fā)生變化,則返回attributes.如果是一個CharacterData節(jié)點發(fā)生變化,則返回characterData,如果是目標節(jié)點的某個子節(jié)點發(fā)生了變化,則返回childList.
target 返回此次變化影響到的節(jié)點,具體返回那種節(jié)點類型是根據(jù)type值的不同而不同的,如果type為attributes,則返回發(fā)生變化的屬性節(jié)點所在的元素節(jié)點,如果type值為characterData,則返回發(fā)生變化的這個characterData節(jié)點.如果type為childList,則返回發(fā)生變化的子節(jié)點的父節(jié)點.
addedNodes 返回被添加的節(jié)點
removedNodes 返回被刪除的節(jié)點
previousSibling 返回被添加或被刪除的節(jié)點的前一個兄弟節(jié)點
nextSibling 返回被添加或被刪除的節(jié)點的后一個兄弟節(jié)點
attributeName 返回變更屬性的本地名稱
oldValue 根據(jù)type值的不同,返回的值也會不同.如果type為attributes,則返回該屬性變化之前的屬性值.如果type為characterData,則返回該節(jié)點變化之前的文本數(shù)據(jù).如果type為childList,則返回null

3 使用實例

// Firefox和Chrome早期版本中帶有前綴 var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver // 選擇目標節(jié)點 var target = document.querySelector('#some-id'); // 創(chuàng)建觀察者對象 var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { console.log(mutation.type); }); }); // 配置觀察選項: var config = { attributes: true, childList: true, characterData: true } // 傳入目標節(jié)點和觀察選項 observer.observe(target, config); // 隨后,你還可以停止觀察 observer.disconnect();

4 參考鏈接

[1].MDN Mutation Observer
[2].將突變事件和屬性更改事件遷移到突變觀察者



文/falm(簡書作者)
原文鏈接:http://www.jianshu.com/p/b5c9e4c7b1e1
著作權歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權,并標注“簡書作者”。

總結(jié)

以上是生活随笔為你收集整理的MutationObserver 监听DOM树变化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久99国产精品视频 | 日本色综合 | 69久久久久久 | 日本中文不卡 | 国产精品2区 | 一区二区三区高清在线观看 | 中文字幕一区二区三区波野结 | 成人xxx | 亚洲精品影视 | 欧美麻豆视频 | 大屁股白浆一区二区 | 成人在线观看一区二区 | 国产又粗又猛又爽又黄91 | 亚洲综合视频在线观看 | 三级黄在线观看 | 色偷偷91 | 日韩精品v | 久久国产乱 | 少妇xxxxxx| 天海翼一区二区 | 亚洲色图综合网 | 在线观看免费黄色 | 亚洲高清免费观看 | 国产精品网站入口 | 欧美放荡性医生videos | 国产高清免费视频 | 中文字幕高清在线免费播放 | 亚洲成人av中文字幕 | 伊人久久大香线蕉av色婷婷色 | 色a视频 | 久久国产在线视频 | 妺妺窝人体色777777 | 国内自拍偷拍 | 欧美一二三视频 | 99人妻碰碰碰久久久久禁片 | 亚洲成人婷婷 | 亚洲精品影视 | 欧美大片一区二区 | 欧美videos另类精品 | 五月天黄色小说 | 视频免费1区二区三区 | 亚洲欧美日韩激情 | 日本加勒比中文字幕 | 撸啊撸在线视频 | 欧美做受 | 一级黄色片一级黄色片 | 亚洲在线免费观看 | 国产99页| 亚洲一区小说 | 裸体男女树林做爰 | 亚洲精品一区二区在线 | 日本三级一区二区三区 | 99视频精品在线 | 美女被啪羞羞粉色视频 | 大屁股一区二区三区 | 国产三级在线观看视频 | 一级片免费观看视频 | 午夜视频在线免费看 | 一节黄色片 | 亚洲a一区二区 | 在线观看中文字幕第一页 | 亚洲综合国产 | 五月天狠狠干 | 久久久国产成人一区二区三区 | av网站导航 | 久久久99精品国产一区二区三区 | 穿越异世荒淫h啪肉np文 | 五月天综合 | 高潮videossex高潮 | 久久精品色妇熟妇丰满人妻 | 日韩成人在线一区 | 日本一本高清 | 国产精品一区二区麻豆 | 喷水视频在线观看 | 毛片的网站 | 青青草五月天 | 国产天堂第一区 | 美女毛片视频 | 三度诱惑免费版电影在线观看 | 亚洲1234区| 毛片av在线播放 | 成人h视频在线观看 | 日韩在线观看中文字幕 | 香蕉久久久久 | 天天摸天天做天天爽 | 日韩欧美综合在线 | 无限国产资源 | 深夜福利久久 | 午夜影院在线免费观看 | 色黄视频| 狠狠干超碰 | 中文av网| 天天干天天透 | av无码精品一区二区三区 | 亚洲午夜精选 | 波多野吉衣av无码 | 在线播放你懂得 | 美日韩在线 | 一级黄色大片网站 |