gpt4 book ai didi

javascript - Web 组件 : slot appears outside shadow DOM

转载 作者:行者123 更新时间:2023-11-30 09:19:03 24 4
gpt4 key购买 nike

我想从 <select> 制作一个网络组件元素。我正在尝试获取 <option>用户提供的标记出现在 Shadow DOM 中。

我的组件:

let tmpl = document.createElement('template');
tmpl.innerHTML = `
<select placeholder="text">
<slot name="option"></slot>
</select>
`;

class SelectBox extends HTMLElement {
constructor() {
super();
if (!this.shadowRoot) {
this.root = this.attachShadow({mode: 'open'});
this.root.appendChild(tmpl.content.cloneNode(true));
}
}
}
customElements.define('select-box', SelectBox);

HTML:

<select-box>
<option slot="option" value="text">text</option>
</select-box>

呈现的是一个空的选择框。我可以在控制台中看到该元素为空 enter image description here

这让我相信我还没有掌握将用户元素插入影子 DOM 的过程。

最佳答案

看起来问题是 option 元素无法分配为插槽。

但是,由于您的模板只是一个选择,我想知道您为什么不简单地扩展一个选择并收工。

class SelectBox extends HTMLSelectElement {
connectedCallback() {
// in case is not fully parsed yet ...
if (this.selectedIndex < 0)
return setTimeout(() => this.connectedCallback());
this.addEventListener('change', this);
this.parentNode.insertBefore(
document.createElement('p'),
this.nextSibling
);
this.handleEvent();
}
handleEvent() {
this.nextSibling.textContent =
`${this.selectedIndex}: ${this.value}`;
}
}

customElements.define('select-box', SelectBox, {extends: 'select'});

对于上面的类,你所需要的只是带有你的选项的 DOM,你将选项放在这些无论如何都不属于的地方,只需完全内置扩展即可。

<select is="select-box">
<option value="first">first</option>
<option value="second">second</option>
</select>

您可以看到它正在运行 live in this code pen .

不到1k的polyfill,剩下的是described in this medium post .

我知道这并没有完全解决您的问题,但除非您希望等待所有浏览器修复该问题,否则至少您知道有一种标准/更好的方法来扩展内置函数。

关于javascript - Web 组件 : slot appears outside shadow DOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53011633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com