【发布时间】:2022-01-17 16:14:37
【问题描述】:
我有一组预设的单词,我想在每个条目后随机化并映射空格,然后拆分为单个字符,然后将这些字符作为单独的<div> 放入一个 html 元素中。到目前为止,我有这个确实有效,但它比 150-200 字符有点慢,我猜这是可以理解的。我需要每个角色都在它自己的 <div> 中,所以我不确定如何优化它。
我有一个类似于下面代码sn-p的算法结构。在循环中渲染大量动态 HTML 元素时如何避免优化问题?
let container = document.getElementById('container');
let arr = ['one', 'two', 'three', 'four'];
let currentIndex = arr.length;
let current__text = [], count, randomIndex;
while (currentIndex != 0) {
randomIndex = Math.floor(Math.random() * currentIndex);
--currentIndex;
[current__text[currentIndex], arr[randomIndex]] = [
current__text[randomIndex], arr[currentIndex]];
}
arr = arr.slice(0, count).map(e => e + ' ').join('').split('');
arr.pop();
for (item of arr) {
container.innerHTML += `<div class="char">${item}</div>`;
}
#container{}
.char{}
<div id="container"></div>
【问题讨论】:
-
无关说明:开始使用分号。不使用分号很容易降低代码的可读性,甚至在某些极端情况下导致错误。
-
你能举一个预期输出的例子吗?
-
因为这个原因很慢:
container.innerHTML += ...。不要在循环中设置innerHTML(它会在每一轮中重新创建container的所有HTML 并强制进行布局计算),而是使用insertAdjacentHTML,或者更确切地说动态创建元素,将它们附加到@ 987654331@,然后将documentFragment附加到 DOM。此外,使用 styleSheet 而不是附加内联样式可能会加快创建过程。 -
@Teemu 你是个救星。你是对的,innerHTML += 是问题所在......现在它更快了。谢谢!
-
@Sercan Setting
innerHTMLDOM 中的一个元素只能用于一个目的,使一个元素为空,它不应该用于做任何其他事情。只需阅读documentation 中的所有建议和警告。
标签: javascript arrays algorithm optimization time-complexity