【发布时间】:2020-04-21 06:25:35
【问题描述】:
我正在使用 Web Components 创建自定义 HTML 元素
我通过 REST 服务检索一些 JSON 数据,并希望根据响应动态创建自定义元素。
class LibraryFolders extends HTMLElement {
async connectedCallback() {
// Load folders
const foldersResponse = await fetch('/wp-json/prodes-media-library/v1/folders');
const foldersResponseJson = await foldersResponse.json();
foldersResponseJson.forEach(folder => {
document.createElement('library-folder');
});
}
}
customElements.define('library-folders', LibraryFolders);
这可以正常工作,当使用 createElement 创建元素时,它会在名为 LibraryFolder 的 customElement 类中调用 constructor
class LibraryFolder extends HTMLElement {
constructor() {
super();
// logs <library-folder></library-folder>
console.log(this);
// This results eventually into the following error:
// Failed to construct 'CustomElement': The result must not have a parent
document.querySelector('#folders').appendChild(this);
}
}
customElements.define('library-folder', LibraryFolder);
我尝试归档的是在class LibraryFolder 中的constructor 被触发后追加 library-folder 元素到名为<div id="folders"></div> 的元素。
但是,当尝试这样做会导致以下错误:
未捕获的 DOMException:构造“CustomElement”失败:结果不能有父对象
在 HTMLDocument.createElement (:1:1536)
在 HTMLDocument.document.createElement (:292:44)
在(网址)
在 Array.forEach ()
在 HTMLElement.connectedCallback (URL)
我在这里做错了什么?与其他类似错误不同,文档中没有关于此错误的信息。
【问题讨论】:
-
也许它告诉您组件需要在创建之后添加到DOM。该异常来自
createElement内部,表明它会检查您的构造函数创建的对象以验证它是否还不是 DOM 的一部分,如果您考虑一下createElement的返回值不应该是这种情况. -
@Pointy 所以我不应该将它添加到构造函数内的 DOM 中?
-
对。想一想:
createElement()在正常情况下的概念是制作一个新元素,以后可以在某个地方添加或不添加到 DOM 中。将自身添加到 DOM 的元素会很奇怪。 (一方面,它不能独立于特定的页面结构工作。) -
@Pointy 是的,
An element that adds itself to the DOM would be weird这听起来很合乎逻辑。让我试试看,然后再回来看看它是否有效。 -
@Pointy 谢谢你,你把我送到了正确的方向,我设法用你的 cmets 解决了它。我已将其添加为将来遇到相同错误的人的答案。
标签: javascript es6-class custom-element