-
-
Save rlemon/e4ed68f396b4bd13e6179686ff29e331 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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