javascript - "unnamed"插槽上的后备内容永远不会显示

标签 javascript web-component shadow-dom custom-element html5-template

我试图弄清楚 Web 组件是如何工作的,但无法完全理解插槽中后备内容的规则:

我有一个网络组件,例如:

const template = document.createElement('template');
template.innerHTML = `
  <slot name="content">
    <span>fallback</span>
  </slot>
  <slot>
    <span>fallback on an anonymus slot</span>
  </slot>
  <section>...and more content form shadow DOM</section>
`;

class SomeComponent extends HTMLElement{
  constructor() {
    super();

    const shadowRoot = this.attachShadow({mode: 'open'});
    shadowRoot.appendChild(template.content.cloneNode(true));
  }
}

window.customElements.define('some-component', SomeComponent);

如果我把这个组件放在像这样的页面上

<some-component>
  <span slot="content">named slot content</span>
</some-component>

我从未见过未命名插槽的“后备”内容:

enter image description here

但它确实存在于影子 DOM 中:

enter image description here

我不使用任何 pollyfills 并依赖当前的 Chrome 网络组件支持

最佳答案

这是预期的行为。 实际上,后备不应显示,因为某些元素被未命名的 <slot> 捕获并显示。元素:space 之前的(不可见的 CRLF<span> )文本元素和</span>之后标签。

如果删除它们:

<some-component><span slot="content">named slot content</span></some-component>

...然后您将看到后备文本!

const template = document.createElement('template');
template.innerHTML = `
  <slot name="content">
    <span>fallback</span>
  </slot>
  <slot>
    <span>fallback on an anonymus slot</span>
  </slot>
  <section>...and more content form shadow DOM</section>
`;

class SomeComponent extends HTMLElement{
  constructor() {
    super();

    const shadowRoot = this.attachShadow({mode: 'open'});
    shadowRoot.appendChild(template.content.cloneNode(true));
  }
}

window.customElements.define('some-component', SomeComponent);
<some-component><span slot="content">named slot content</span></some-component>

关于javascript - "unnamed"插槽上的后备内容永远不会显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53182353/

相关文章:

javascript - 无论键盘布局如何,都获取键码

javascript - 如何在单击时调用自定义元素成员方法?

javascript - 需要帮助理解 Shadow DOM

javascript - 如何添加新类并从类继承重构为行为委托(delegate)设计模式?

javascript - AWS elastic beanstalk,在 Django 中提供多个静态文件

javascript - 检测 dom 元素是自定义 Web 组件还是 html 元素

css - 深度选择器的自定义样式混合

ReactJS 和 Material UI - ClickawayListener 在 Shadow DOM 中无法正常工作

dom - 将分布式子项附加到 Polymer 中的 <content> 元素

javascript - Babel 6 react JSX 转换器 - 禁用严格