我正在尝试获取页眉的内部文本,然后我想拆分字符,然后将每个字符包装在一个跨度中。我以前尝试过使用insertBefore,但无法使其工作。
这是我当前的代码,到目前为止,它只记录每个字符。
// Title Split
const titleSplit = document.querySelectorAll('.title-split');
// Each El
Array.prototype.forEach.call(titleSplit, function(el, i) {
let innerText = el.innerText;
el.setAttribute('data-word', innerText);
const chars = innerText.split('');
Array.prototype.forEach.call(chars, function(el, i) {
console.log(el);
});
});
我特别不想要任何jQuery解决方案。我正在尝试反向学习Javascript以提高效率。任何建议都很好。我试着在forEach的字符中插入insertBefore,但它一直在说undefined。
document.querySelectorAll(...)
返回一个包含名为.forEach()
的方法的NodeList
。所以不是
Array.prototype.forEach.call(titleSplit, function(el, i) {
...
}
你可以直接做
titleSplit.forEach(...);
同样,你也可以做
chars.forEach(...);
因为chars
是一个数组,您可以在数组上调用.forEach()
方法。
现在来回答您的问题,一旦您有了chars
数组,您就可以使用.map()
方法而不是.forEach()
来获得一个新的数组,该数组包含字符串,其中每个字符都由span
标记包装。
const result = chars.map(c => `<span>${c}</span>`);
最后,您需要对result
数组进行迭代,并将其元素插入到DOM
中。
result.forEach(el => document.body.append(el));
我已经使用document.body
作为所有span
元素的父元素。您可以使用任何需要作为所有span
元素的父元素的元素。
您可以在forEach()
循环中使用map()
来构造带有span的结果。此外,我建议您不要将innerText
用作变量名,因为它是属性名,可能会导致一些混淆:
// Title Split
const titleSplit = document.querySelectorAll('.title-split');
// Each El
Array.prototype.forEach.call(titleSplit, function(el, i) {
let ElText = el.innerText;
el.setAttribute('data-word', ElText);
const chars = ElText.split('');
var res = chars.map(function(el, i) {
return `<span>${el}</span>`;
}).join('');
el.innerHTML = res;
});
span{
border: 1px solid red;
padding: 2px;
}
<div class="title-split">Hello there</div>
const myHeader = querySelector('query my header please');
const spans = myHeader.innerText
.split('')
.map((char) => `<span>${char}</span>`)
.join('');
document.querySelector('query element to put them').innerHTML = spans;
// OR
document.querySelector('query element to put them').insertAdjacentHTML('beforeend', spans);
// etc.