5

假设我创建并插入了这样的元素

<template id="react-web-component">
  <span>template stuff</span
  <script src="/static/js/bundle.js" type="text/javascript"></script>
</template>
<script>
  (function (window, document) {
    const doc = (document._currentScript || document.currentScript).ownerDocument;
    const proto = Object.create(HTMLElement.prototype, {
      attachedCallback: {
        value: function () {
          const template = doc.querySelector('template#react-web-component').content;
          const shadowRoot = this.attachShadow({ mode: 'open' });
          shadowRoot.appendChild(template.cloneNode(true));
        },
      },
    });
    document.registerElement('react-web-component', { prototype: proto });
  })(window, document);
</script>
<react-web-component></react-web-component>

现在我想使用 aquerySelector来访问我的元素的开放阴影 dom。像这样:

document.querySelector('react-web-component::shadow')

但这不起作用。还有其他方法吗?

编辑以回应@Supersharp 的回答

对不起,我没有说清楚。我使用的 webpackstyle-loader只接受它与 一起使用的 CSS 选择器document.querySelector,所以我要求的是我可以使用这种方式的 CSS 选择器。

4

2 回答 2

8

shadowRoot通过影子主机的属性获取:

document.querySelector('react-web-component').shadowRoot

更新

曾经有这种 CSS 选择器,但现在已弃用。

也许您可以尝试使用普通 DOM 而不是 Shadow DOM。

于 2017-08-08T20:38:20.837 回答
0

如果我理解正确的话,它有一个编辑草稿(因此它还不存在)。

https://drafts.c​​sswg.org/css-scoping/#selectors

所以答案是“不”,你不能这样做。

于 2017-08-08T20:57:20.807 回答