【发布时间】:2019-02-06 20:52:52
【问题描述】:
我想知道我是否在正确的轨道上
目标:需要确保所有元素最终都在 shadowDOM 中
所以手动创建了HTML文件
<cardts-pile>
<cardts-card>A</cardts-card>
<cardts-card>B</cardts-card>
</cardts-pile>
在<cardts-pile>的lightDOM中创建卡片
如果我随后将它们移动到 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>
【问题讨论】:
-
你为什么不用 slotchange 事件来代替呢?
-
[blush] 因为我不知道
slotchange...。阅读slotchange docs 在我看来,它更像是插槽上的MutationObserver,看起来不像它将阻止disconnectedCallback() -
你是对的......我不明白你的问题的目标
标签: javascript web-component shadow-dom custom-element native-web-component