[Web APIs] DOM MutationObserver

當我們在寫Web時,常常會不知覺的用了許多 API 來幫助我們開發,像是上篇的「[jQuery] Global Ajax Event Handlers」也是其中一種。

然而我們常常會使用這些功能,卻不清楚其來由,懵懵懂懂的很容易會有一些錯誤觀念或者錯誤的使用方法,及「知其然,而不知其所以然」的現象,因此在日後的文章有機會會在特別詳述原理的部分。

今天要介紹的是 MutationObserver 不是 MutationEvents ,兩者都是在監聽 DOM 有被異動時,需要做一些相對應的事情;     

換而言之,就是當網頁上有新的「按鈕」、「TextBox」、「標籤」...等物件被生成或異動時,我們可以透過 MutationObserver 來做進一步的操作。MutationEvents 因為效能上的考量,已經在DOM3被淘汰了,請不要再繼續使用

MutationObserver DOM4 提出來取代 MutationEvents,當然就是解決了效能上的問題,其原理是當DOM物件被異動時,會先複製一份DOM 且 Queue住,接著會通知 MutationObserver 有哪些 DOM 在被異動中,接著 Developer 就可以做一些相對應的事情,像是初始化、套css...等。

當然,其實我們不用了解那麼多也是可以使用的,如下範例是從Blog修改而來:

// 要監控的目標
var target = document.querySelector('#some-id');
 
// new MutationObserver
var observer = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
        console.log(mutation.type);
    });
});
 
// 參數:決定要監控哪些物件
var config = { attributes: true, childList: true, characterData: true }

// 跟 MutationObserver 指定要監控的目標與參數
observer.observe(target, config);
 
// 停止監控
observer.disconnect();

參考:

  1. https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
  2. https://www.w3.org/TR/dom/#mutation-observers