我正在使用Chrome Canary (33.0.1712.3) 探索导入、模板、影子DOM和自定义元素。在网格布局中,我有一个特定的内容元素(显示区域),将显示来自文件的不同Web组件或克隆的轻DOM片段。
然而,一旦添加了影子DOM,我就无法重新显示普通的HTML DOM,因为我不知道如何删除影子根。一旦创建,影子根将会一直存在并干扰普通DOM的渲染。(我已查看了各种W3C规范,如Web组件介绍、影子DOM、模板、Bidelman在HTML5 Rocks上的文章等)我在下面的简单示例中隔离了问题:
点击“显示普通的div”,点击“显示阴影模板”,然后点击“显示普通的div”。每次点击后,在devtools中检查输出。第三次点击后,按钮下方没有任何输出,并且在devtools中我看到:
然而,一旦添加了影子DOM,我就无法重新显示普通的HTML DOM,因为我不知道如何删除影子根。一旦创建,影子根将会一直存在并干扰普通DOM的渲染。(我已查看了各种W3C规范,如Web组件介绍、影子DOM、模板、Bidelman在HTML5 Rocks上的文章等)我在下面的简单示例中隔离了问题:
点击“显示普通的div”,点击“显示阴影模板”,然后点击“显示普通的div”。每次点击后,在devtools中检查输出。第三次点击后,按钮下方没有任何输出,并且在devtools中我看到:
<div id="content">
#document-fragment
<div id="plaindiv">Plain old div</div>
</div>
我需要添加什么内容到removeShadow()函数中以删除阴影根并将内容元素完全重置为其初始状态?
removing_shadows.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<template id="shadowedTemplateComponent">
<style>
div { background: lightgray; }
#t { color: red; }
</style>
<div id="t">template</div>
<script>console.log("Activated the shadowed template component.");</script>
</template>
<template id="plainDiv">
<div id="plaindiv">Plain old div</div>
</template>
</head>
<body>
<div>
<input type="button" value="show plain old div" onclick="showPlainOldDiv()"/>
<input type="button" value="show shadowed template" onclick="showShadowTemplate()"/>
<div id="content"></div>
</div>
<script>
function removeChildren(elt) {
console.log('removing children: %s', elt);
while (elt.firstChild) {
elt.removeChild(elt.firstChild);
}
}
function removeShadow(elt) {
if (elt.shadowRoot) {
console.log('removing shadow: %s', elt);
removeChildren(elt.shadowRoot); // Leaves the shadow root property.
// elt.shadowRoot = null; doesn't work
// delete elt.shadowRoot; doesn't work
// What goes here to delete the shadow root (#document-fragment in devtools)?
}
}
function showPlainOldDiv() {
console.log('adding a plain old div');
var host = document.querySelector('#content');
removeChildren(host);
removeShadow(host);
var template = document.querySelector('#plainDiv');
host.appendChild(template.content.cloneNode(true));
}
function showShadowTemplate() {
console.log('adding shadowed template component');
var host = document.querySelector('#content');
removeChildren(host);
removeShadow(host);
var template = document.querySelector('#shadowedTemplateComponent');
var root = host.shadowRoot || host.webkitCreateShadowRoot();
root.appendChild(template.content.cloneNode(true));
}
</script>
</body>
</html>