MutationObserver
<body>
<div type="button" onclick="this.innerHTML='<span>clicked</span>'">click</div>
<script>// select the target node
var target = document.querySelector('body');
// create an observer instance
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
alert(mutation.type+'\n'+[].join.call(mutation.addedNodes,','));
});
});
// configuration of the observer:
var config = { attributes: true, childList: true, subtree: true };
// pass in the target node, as well as the observer options
observer.observe(target, config);
// later, you can stop observing
//observer.disconnect();
</script>
</body>
А для старых ie придётся танцевать с бубном. В интернете гулится вроде всякое на эту тему.
На самом деле необходимости в подобных вещах при нормальной разработке нет. Вообще нет. Если какая-то функция что-то меняет в dom - вам надо просто следить за этой функцией, а не последствиями.