将使用JS创建的模板标签附加到Web组件内的阴影后不会出现

时间:2019-01-13 13:49:57

标签: javascript web-component shadow-dom html5-template

我希望下面的代码创建一个包含div且其中包含文本“ Hi”的元素。

该元素出现在检查器中,但屏幕上看不到任何文本。

当我将模板从template更改为div时,将显示文本。我在这里做错了什么?

class MyComponent extends HTMLElement {
    constructor() {
        super()

        const shadowRoot = this.attachShadow({ mode: 'open' })
        const template = document.createElement('template')
        const div = document.createElement('div')

        div.innerHTML = 'Hi'
        template.appendChild(div)

        shadowRoot.appendChild(template.content)
    }
}
customElements.define('my-component', MyComponent)

2 个答案:

答案 0 :(得分:4)

<template>是一个特殊元素。

通过其content属性附加一些HTML元素:

template.content.appendChild(div)

或通过其innerHTML属性添加HTML代码:

template.innerHTML = '<div>Hi</div>'

答案 1 :(得分:1)

我同意@Supersharp的回答。这是不需要<template>的替代解决方案。

class MyComponent extends HTMLElement {
    constructor() {
        super()
        const div = document.createElement('div')
        div.innerHTML = 'Hi'
        this.attachShadow({ mode: 'open' }).appendChild(div)
    }
}
customElements.define('my-component', MyComponent)
<my-component></my-component>

或者您可以通过使用shadowRoot的innerHTML来做到这一点:

class MyComponent extends HTMLElement {
    constructor() {
        super()
        this.attachShadow({ mode: 'open' }).innerHTML = "<div>Hi</div>";
    }
}
customElements.define('my-component', MyComponent)
<my-component></my-component>