我该如何在一个自定义元素的影子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中使用。如果需要更多信息,请告诉我。提前致谢。
编辑:澄清一下,从update()
内调用console.log(inputs.length)
输出0
而不是2
。