Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
* cloneNode(true), but also clones shadow roots.
* @param {Element}
* @param {ShadowRoot[]} [shadowRoots] Any closed shadow roots passed here will be included.
function cloneWithShadowRoots(node, shadowRoots) {
function walk(node, clone) {
let shadow = node.shadowRoot || shadowRoots.find(r => === node);
if (shadow) {
clone.attachShadow({ mode: shadow.mode }).append(...[], c => c.cloneNode(true)));
for (let i=0; i<node.children.length; i++) walk(node.children[i], clone.children[i]);
const clone = node.cloneNode(true);
walk(node, clone);
return clone;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment