我可以使用以下代码缩短按Id选择的元素的innerHTML:
<p id="demo">The quick brown fox jumps over the lazy dog</p>
<p id="demo2" class="demo">The quick brown fox jumps over the lazy dog</p>
let text = document.getElementById("demo").innerHTML;
document.getElementById("demo").innerHTML = text.slice(0, 9);
作为输出
The quick
The quick brown fox jumps over the lazy dog
然而,我无法让它处理包含同一类的多个元素。我试过这个:
let text = document.getElementsByClassName('demo');
for (let i=0; i < text.length; i++) {
text.innerHTML.slice(0, 9);
}
但在Codepen上,它只是说";TypeError:elements.inerHTML未定义;。
请问我缺了什么?
使用普通javascript不能同时更改所有元素。相反,您需要对它们进行迭代。此外,仅在innerHTML
上调用slice
不会更改它,您需要分配值。
let texts = document.getElementsByClassName('demo');
for (let i=0; i < texts.length; i++) {
texts[i].innerHTML = texts[i].innerHTML.slice(0, 9);
}
您在不引用索引的情况下对HTMLCollection
进行迭代:text[i]
。
-
现代JS倾向于在元素选择上支持
querySelectorAll
,然后用类似for...of
的forEach
的东西迭代它。 -
您应该针对元素的
textContent
或innerText
,而不是其innerHTML
。 -
我可能更喜欢
substr
从字符串中获取字符,而不是slice
。
forEach
// Cache all the demo elements
const els = document.querySelectorAll('.demo');
// Loop over them, and update the textContent
els.forEach(el => {
const text = el.textContent;
el.textContent = text.substr(0, 9);
});
<p class="demo">The quick brown fox jumps over the lazy dog</p>
<p>The quick brown fox jumps over the lazy dog</p>
<p class="demo">The quick brown fox jumps over the lazy dog</p>
注意:除了抛出异常之外,没有任何方法可以停止或中断
forEach
循环。如果您需要这样的行为,forEach
方法是错误的工具。
IE11也存在兼容性问题,因此这里是@connexo在评论中建议的for...of
。
for...of
// Cache all the demo elements
const els = document.querySelectorAll('.demo');
// Loop over them, and update the textContent
for (const el of els) {
const text = el.textContent;
el.textContent = text.substr(0, 9);
}
<p class="demo">The quick brown fox jumps over the lazy dog</p>
<p>The quick brown fox jumps over the lazy dog</p>
<p class="demo">The quick brown fox jumps over the lazy dog</p>
尝试:
let text = document.getElementsByClassName('demo');
for (let i=0; i < text.length; i++) {
text[i].innerHTML = text[i].innerHTML.slice(0, 9);
}