如何序列化包括Shadow DOM的HTML DOM?

Res*_*nce 5 html javascript html5 dom shadow-dom

我想将包括Shadow DOM树在内的整个HTML DOM序列化为一个字符串,即以可重构方式同时包括shadow主机和shadow根。

我可以通过.shadowRoot.innerHTML以编程方式访问Shadow DOM,但在整个DOM上调用.outerHTML或使用XMLSerializer都不包括shadowRoot。

有没有一种方法可以序列化整个HTML文档(包括Shadow DOM树)?

gue*_*314 2

我想将包括 Shadow DOM 树在内的整个 HTML DOM 序列化为一个字符串,即以可以重建的方式包括影子主机和影子根。

注意,shadowRoot节点不可克隆;尽管您应该能够迭代childNodesshadowRoot检索.nodeValue.innerHTML中的每个节点shadowRoot

var elems = document.getElementById("host").shadowRoot.childNodes;
var shadowHTML = "";
for (var i = 0; i < elems.length; i++) {
  shadowHTML += elems[i].nodeValue || elems[i].outerHTML;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以调用.innerHTMLchained to .treeRootproperty ofshadowRoot来检索完整htmlshadowRoot.

var shadowHTML = document.getElementById("host").shadowRoot.treeRoot.innerHTML;
Run Code Online (Sandbox Code Playgroud)

我可以通过 .shadowRoot.innerHTML 以编程方式访问 Shadow DOM,但在整个 DOM 上调用 .outerHTML 或使用 XMLSerializer 不包括 ShadowRoot。

您可以使用.outerHTML调用.host来检索主机html中的元素。documentshadowRoot

var host = document.getElementById("host").shadowRoot.host.outerHTML;
Run Code Online (Sandbox Code Playgroud)

然后可以通过创建一个元素并设置为string变量来shadowRoot重建;将新创建的元素附加到.<template>.innerHTMLshadowHTML.treeRoot.innerHTMLtemplateshadowRoot