我想知道我是否在正确的轨道上
目标:需要确保所有元素最终都在 shadowDOM 中
所以手动创建的 HTML 文件
<cardts-pile>
<cardts-card>A</cardts-card>
<cardts-card>B</cardts-card>
</cardts-pile>
在light DOM 中创建卡片<cardts-pile>
如果我然后将它们移动到 shadowDOM(当然):
►<cardts-card>
从 DOM 中移除(触发disconnectedCallback()
)
►<cardts-card>
再次添加(触发connectedCallback()
)
[请参阅下面的运行代码狙击手的 console.log]
我card.connectedCallback()
在“重新连接”上有更多花哨的代码,它基本上再次触发了完全相同的代码。
问题
是否可以在不更改 DOM 的情况下移动节点?
是否有 OOTB 代码来检查现有
<cardts-card>
的是否仅被移动,
因此connectedCallback
知道它不需要再次运行代码。我应该做一些不同的事情,
让那些 lightDOM 元素立即进入 shadowDOM 吗?
customElements.define('cardts-pile', class extends HTMLElement {
constructor(){
super();
this.attachShadow({mode: 'open'}).innerHTML='<slot></slot>';
}
connectedCallback() {
console.log('connect pile');
}
});
customElements.define('cardts-card', class extends HTMLElement {
constructor(){
super();
this.attachShadow({mode: 'open'}).innerHTML='<slot></slot>';
}
connectedCallback() {
console.log('connect card',this.innerText);
if (!this.getRootNode().host) // not in shadowDOM
this.parentNode.shadowRoot.insertBefore(this,null);//or appendChild
}
disconnectedCallback() {
console.log('disconnect card',this.innerText);
}
});
<cardts-pile>
<cardts-card>A</cardts-card>
<cardts-card>B</cardts-card>
</cardts-pile>