首页 文章

如何从模板中使用shadow DOM装饰的HTML元素中删除阴影根? [网站组件]

提问于
浏览
8

我在Chrome Canary(33.0.1712.3)中探索导入,模板,影子DOM和自定义元素 . 在网格布局中,我有一个特定的内容元素(显示区域),它将显示从文件导入的不同Web组件或克隆的轻型DOM片段 . 但是,一旦添加了阴影DOM,我就无法重新显示普通的HTML DOM,因为我不知道如何删除阴影根 . 一旦创建,阴影根就会保留并干扰普通DOM的呈现 . (我已经看过各种W3C规范,例如Web组件介绍,影子DOM,模板,Bidelman关于HTML5 Rocks的文章等) . 我在下面的一个简单示例中将问题分离出来:

点击“show plain old div”;点击“显示阴影模板”;点击“show plain old div” . 每次点击后检查devtools . 第三次点击后,按钮下面没有输出,在我看到的devtools中:

<div id="content">
  #document-fragment
  <div id="plaindiv">Plain old div</div>
</div>

我需要添加什么来删除shadowShadow()以删除阴影根并将内容元素完全重置为其初始状态?

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>

2 回答

  • 2

    添加后,您无法删除阴影根 . 但是,您可以用更新的替换它 .

    正如这里提到的,http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-301/,最新的影子根"wins"并成为渲染的根 .

    您可以使用仅包含 <content> 伪元素的新影子根替换您的影子根,以便将来自light DOM的所有内容插入到影子DOM中 . 那时,据我所知,它在功能上等同于根本没有影子DOM .

  • 1

    Shadow DOM的规范从v0移动到v1 .

    其中一个变化是在v1中无法在自身上创建阴影根,并且主机元素可能只包含一个阴影根 .

    所以似乎用新的空白阴影根替换阴影根的答案已经无效了 .

相关问题