【发布时间】:2019-04-07 16:20:15
【问题描述】:
如何在另一个自定义元素的 shadow dom 中迭代一个自定义元素的实例? HTMLCollections 似乎没有按预期运行。 (我是一个 jQuerian 和 vanilla js 的新手,所以我确定我在某个地方犯了一个明显的错误)。
HTML
<spk-root>
<spk-input></spk-input>
<spk-input></spk-input>
</spk-root>
自定义元素定义
对于spk-input:
class SpektacularInput extends HTMLElement {
constructor() {
super();
}
}
window.customElements.define('spk-input', SpektacularInput);
对于spk-root:
let template = document.createElement('template');
template.innerHTML = `
<canvas id='spektacular'></canvas>
<slot></slot>
`;
class SpektacularRoot extends HTMLElement {
constructor() {
super();
let shadowRoot = this.attachShadow({mode: 'open'});
shadowRoot.appendChild(template.content.cloneNode(true));
}
update() {
let inputs = this.getElementsByTagName('spk-input')
}
connectedCallback() {
this.update();
}
}
window.customElements.define('spk-root', SpektacularRoot);
这是我不明白的部分。在update() 方法内部:
console.log(inputs) 返回一个 HTMLCollection:
console.log(inputs)
// output
HTMLCollection []
0: spk-input
1: spk-input
length: 2
__proto__: HTMLCollection
但是,HTMLCollection 不能使用 for 循环进行迭代,因为它没有长度。
console.log(inputs.length)
// output
0
搜索 SO 显示 HTMLCollections 类似于数组,但不是数组。尝试使用 Array.from(inputs) 或扩展运算符使其成为一个数组会导致一个空数组。
这里发生了什么?如何通过update() 方法迭代spk-root 中的spk-input 元素?
我正在使用 gulp-babel 和 gulp-concat 并使用 Chrome。如果需要更多信息,请告诉我。提前致谢。
编辑:澄清一下,从内部调用console.log(inputs.length)update()输出0而不是2。
【问题讨论】:
标签: javascript html shadow-dom custom-element