I need a way to listen for changes for when a node's children are removed or added. I made an autoscrolling plugin that keeps an element scrolled to the bottom as new items are added. The event I'm listening to is DOMNodeInserted
and DOMNodeRemoved
.
I was looking for polyfills for DOMNodeInserted
and DOMNodeRemoved
. Looking around I wasn't able to find any that already existed. The event is not supported in all browsers and is currently deprecated.I have a simple (likely naive) polyfill I wrote quickly but I doubt it works (well).
I know these events are deprecated, but is there a better way to listen for element children changes?
(function() {
var works = false;
var $test = document.createElement("div");
var $testchild = document.createElement("a");
$test.addEventListener("DOMNodeInserted", function() {
works = true;
}, false);
$test.appendChild($testchild);
if(!works) {
var nodeproto = Node.prototype;
var nativeAppend = nodeproto.appendChild;
var nativeRemove = nodeproto.removeChild;
nodeproto.appendChild = function() {
nativeAppend.apply(this, arguments);
this.fireEvent("DOMNodeInserted");
};
nodeproto.removeChild = function() {
nativeRemove.apply(this, arguments);
this.fireEvent("DOMNodeRemoved");
};
}
})();
MutationObserver
object for modern browsers. For old browsers you have no other choice than using an override approach, however like you said it might be hard to implement something that will work cross-browser because not all browsers will expose the DOM objects such asElement
. – PaceMutationObserver
. At a small scale you could always useobservedEl.cloneNode()
to take a snapshot of the node at specific intervals and recursively compare thechildNodes
with the live element. If you know which targets might be observed, you can then do something likestartObserving(node)
which would fireDOMNodeInserted
/DOMNOdeRemoved
events on these nodes when a change is detected. – Pace