Я изучаю импорт, шаблоны, теневой DOM и настраиваемые элементы в Chrome Canary (33.0.1712.3). В макете сетки у меня есть определенный элемент содержимого (область отображения), который будет отображать различные веб-компоненты или клонированные легкие фрагменты DOM, импортированные из файлов.
Однако я не могу повторно отобразить обычную HTML DOM после добавления теневой DOM, потому что я не знаю, как удалить теневой корень. После создания корень тени остается и мешает отрисовке обычной модели DOM. (Я рассмотрел различные спецификации W3C, такие как введение в веб-компоненты, теневой DOM, шаблоны, статьи Бидельмана о HTML5 Rocks и т. Д.) Я выделил проблему в простом примере ниже:
Нажмите «показать старый простой div»; нажмите «показать затененный шаблон»; нажмите "показать старый простой div". Проверяйте в devtools после каждого щелчка. После третьего щелчка я не вижу вывода под кнопками и в инструментах разработки:
<div id="content">
#document-fragment
<div id="plaindiv">Plain old div</div>
</div>
Что мне нужно добавить в removeShadow (), чтобы удалить теневой корень и полностью вернуть элемент содержимого в исходное состояние?
remove_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>