在這之前 DOM3 提供了 Mutation events 事件
可以監聽到屬性、文本內容、節點插入刪除、子節點變化等事件。可是該事件 W3C 已廢棄,雖然一些浏覽器仍然支持,但不建議使用。
MutationObserver目前IE11+及其它浏覽器最新版本都已支持。可以通過以下代碼判斷是否支持
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 有如下選項
當變動發生時回調函數會將變動記錄 MutationRecord 對象傳入,MutationRecord 包含了 DOM 的相關信息,有如下屬性
示例1:觀察子元素的變動
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