Я использую библиотеку Stencil.js для создания веб-компонентов. Библиотека загружает полифилл в Edge и IE11, чтобы обеспечить их поддержку браузером, поскольку у них отсутствует встроенная поддержка спецификации веб-компонентов.
В Chrome, если я изменяю пользовательский элемент light dom , используя собственный DOM API (appendChild, removeChild и т. Д.), И теневой домен содержит элемент, Chrome повторно анализирует сплющенное дерево Dom и обновления для Light DOM отражаются в слоте.
Похоже, что это может быть ошибка или ограничение в polyfill. Кто-нибудь знает, правда ли это и есть ли обходные пути?
Пример кода:
// web component
@Component({
tag: "foo-component",
shadow: true
})
export class Foo {
return (
<Host>
<div class="stylin"><slot /></div>
</Host>
);
}
<body>
<foo-component><p>bar</p></foo-component>
</body>
var newPar = document.createElement("p");
newPar.innerHTML = "bar2";
document.querySelector("foo-component").appendChild( newPar );
Ожидаемое сплющенное дерево:
<foo-component>
#shadowRoot <!-- shadowRoot is simulated in Edge -->
<div class="stylin><p>bar</p><p>bar2</p></div>
</foo-component>
Фактическое сплющенное дерево:
<foo-component>
#shadowRoot <!-- shadowRoot is simulated in Edge -->
<div class="stylin><p>bar</p></div>
<p>bar2</p>
</foo-component>