Skip to content

Instantly share code, notes, and snippets.

@Dj0ulo
Last active April 16, 2023 17:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Dj0ulo/d8f603b4cadc0d8a936932cd203ce819 to your computer and use it in GitHub Desktop.
Save Dj0ulo/d8f603b4cadc0d8a936932cd203ce819 to your computer and use it in GitHub Desktop.
function observeShadowRoots(handle, element, config) {
setObserver((mutations) => {
mutations
.filter(m => !!m.addedNodes.length)
.forEach(m =>
[...m.addedNodes]
.filter(node => node.shadowRoot)
.forEach(node => observeShadowRoots(handle, node.shadowRoot, config))
);
handle(mutations);
}, element, config);
if (element.shadowRoot) {
observeShadowRoots(handle, element.shadowRoot, config);
}
[...element.querySelectorAll('*')]
.filter(child => child.shadowRoot)
.forEach(child => observeShadowRoots(handle, child.shadowRoot, config));
};
function setObserver(callback, target, options) {
const observer = new MutationObserver(callback);
observer.observe(target, options);
return observer;
}
function $$shadow(query, element = document) {
return [
...element.querySelectorAll(query),
...(element.shadowRoot ? $$shadow(query, element.shadowRoot) : []),
...[...element.querySelectorAll('*')]
.filter(x => x.shadowRoot)
.map(x => $$shadow(query, x.shadowRoot))
.flat()
];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment