Skip to content

Instantly share code, notes, and snippets.

@rlemon
Created March 19, 2018 12:28
Show Gist options
  • Save rlemon/e4ed68f396b4bd13e6179686ff29e331 to your computer and use it in GitHub Desktop.
Save rlemon/e4ed68f396b4bd13e6179686ff29e331 to your computer and use it in GitHub Desktop.
const DOMObserver = {
parsers: [],
watchers: [],
queue: [],
observer: new MutationObserver( records => {
for( const record of records ) {
DOMObserver.force(record);
}
}).observe(document.body, {
subtree: true,
childList: true
}),
addParser (parser, selector) {
if( selector ) DOMObserver.queue.push(selector);
DOMObserver.parsers.push(parser);
},
addWatcher (watcher) {
DOMObserver.watchers.push(watcher);
},
drain() {
for( const selector of DOMObserver.queue ) {
DOMObserver.force({addedNodes: document.querySelectorAll(selector)});
}
DOMObserver.queue = [];
},
force({addedNodes, removedNodes = []}) {
for( const addedNode of Array.from(addedNodes) ) {
if( !addedNode.classList ) return;
DOMObserver.parsers.forEach( parser => parser(addedNode));
}
for( const removedNode of Array.from(removedNodes) ) {
DOMObserver.watchers.forEach(watcher => watcher(removedNode));
}
}
};
// ---------------------
function genericParser(node) {
// node that was added, test for your elements here
if( node.classList && node.classList.contains('message') ) {
// do shit
}
}
DOMObserver.addParser(genericParser, '.user-container .message') // you need to pass a selector that will match the elements as well
// add as manyt parsers as you like.
DOMObserver.drain(); // kick it off
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment