強大的DOM變化觀察者MutationObserver

在這以前 DOM3 提供了 Mutation events 事件javascript

  1. DOMAttrModified
  2. DOMAttributeNameChanged
  3. DOMCharacterDataModified
  4. DOMElementNameChanged
  5. DOMNodeInserted
  6. DOMNodeInsertedIntoDocument
  7. DOMNodeRemoved
  8. DOMNodeRemovedFromDocument
  9. DOMSubtreeModified

能夠監聽到屬性、文本內容、節點插入刪除、子節點變化等事件。但是該事件 W3C 已廢棄,雖然一些瀏覽器仍然支持,但不建議使用。html


MutationObserver目前IE11+及其它瀏覽器最新版本都已支持。能夠經過如下代碼判斷是否支持java

var MutationObserver = window.MutationObserver ||
    window.WebKitMutationObserver ||
    window.MozMutationObserver;

var supportMutationObserver = !!MutationObserver;

 

使用以下數組

var mo = new MutationObserver(callback);
var div = document.querySelector('div');

var options = {
    'childList': true,
    'arrtibutes': true
};

mo.observer(div, options);

 

options 是配置參數,這裏的配置能夠觀察到 div 元素的子元素和屬於變更。瀏覽器


options 有以下選項app

  1. childList: 子元素的變更
  2. attributes: 屬性的變更
  3. characterData: 節點內容或節點文本的變更
  4. subtree: 全部下屬節點(包括子節點和子節點的子節點)的變更
  5. attributeOldValueL: 值爲true或者爲false。若是爲true,則表示須要記錄變更前的屬性值
  6. characterDataOldValue: 值爲true或者爲false。若是爲true,則表示須要記錄變更前的數據值
  7. attributesFilter: 值爲一個數組,表示須要觀察的特定屬性(好比['class', 'str'])

 

當變更發生時回調函數會將變更記錄 MutationRecord 對象傳入,MutationRecord 包含了 DOM 的相關信息,有以下屬性less

  1. type: 觀察的變更類型(attribute、characterData或者childList)
  2. target: 發生變更的DOM對象
  3. addedNodes: 新增的DOM對象
  4. removeNodes: 刪除的DOM對象
  5. previousSibling: 前一個同級的DOM對象,若是沒有則返回null
  6. nextSibling: 下一個同級的DOM對象,若是沒有就返回null
  7. attributeName: 發生變更的屬性。若是設置了attributeFilter,則只返回預先指定的屬性
  8. oldValue: 變更前的值。這個屬性只對attribute和characterData變更有效,若是發生childList變更,則返回null

 

示例1:觀察子元素的變更dom

function callback(records) {
  records.forEach(function(record) {
    console.log(record)
  })
}
var ob = new MutationObserver(callback)
ob.observe(app1, {
  childList: true,
  subtree: true
})

p1函數

app1

配置項 childList 表示觀察子元素,subtree 表示觀察子元素的下級元素。在本頁面的瀏覽器控制檯輸入如下代碼分別測試測試

app1.removeChild(p1)

app1.appendChild(document.createTextNode('TEST'))

 

 

示例2:觀察屬性的變化

function callback2(records) {
  records.forEach(function(record) {
    console.log(record)
  })
}
var ob2 = new MutationObserver(callback2)
ob2.observe(app2, {
  attribute: true,
  attributeOldValue: true
})
app2

配置參數跟蹤屬性變更('attributes': true),而後設定記錄變更前的值。實際發生變更時,會將變更前的值顯示在控制檯。打開本頁面的瀏覽器控制檯,輸入如下代碼測試

app2.id = 'apptest'

 

示例3:觀察文本元素的變化

function callback3(records) {
  records.forEach(function(record) {
    console.log(record)
  })
}
var ob3 = new MutationObserver(callback3)
ob3.observe(app3, {
  characterData: true
})

 

示例3:觀察元素內容的變更

function callback3(records) {
  records.forEach(function(record) {
    console.log(record)
  })
}
var ob3 = new MutationObserver(callback3)
ob3.observe(app3, {
  childList: true,
  characterData: true,
  characterDataOldValue: true
})
old value

 

配置項會觀察元素文本的變化,當變更時會記錄老的文本元素。打開本頁面的瀏覽器控制檯,輸入如下代碼測試

app3.appendChild(document.createTextNode(' hello'))

 

相關:

https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver

https://dev.opera.com/articles/mutation-observers-tutorial/

http://michalbe.blogspot.com/2013/04/javascript-less-known-parts-dom.html

相關文章
相關標籤/搜索