IE9 +, FF, Webkit:
Использование MutationObserver и откат к устаревшим событиям мутации , если необходимо: (Пример ниже, если только для изменений DOM относительно добавленных или удаленных узлов)
var observeDOM = (function(){ var MutationObserver = window.MutationObserver || window.WebKitMutationObserver; return function( obj, callback ){ if( !obj || !obj.nodeType === 1 ) return; // validation if( MutationObserver ){ // define a new observer var obs = new MutationObserver(function(mutations, observer){ if( mutations[0].addedNodes.length || mutations[0].removedNodes.length ) callback( mutations[0] ); }); // have the observer observe foo for changes in children obs.observe( obj, { childList:true, subtree:true }); } else if( window.addEventListener ){ obj.addEventListener('DOMNodeInserted', callback, false); obj.addEventListener('DOMNodeRemoved', callback, false); } } })(); //------------< DEMO BELOW >---------------- // add item document.querySelector('body > button').onclick = function(e){ var newElmHTML = ""; document.querySelector('ol').insertAdjacentHTML("beforeend", newElmHTML); } // delete item document.querySelector('ol').onclick = function(e){ if( e.target.nodeName == "BUTTON" ) e.target.parentNode.parentNode.removeChild(e.target.parentNode); } // Observe a specific DOM element: observeDOM( document.querySelector('ol'), function(m){ console.clear(); console.log('Added:', m.addedNodes, 'Removed:', m.removedNodes); });