【发布时间】:2022-11-27 02:47:27
【问题描述】:
我正在尝试将在 JS 中创建的元素动态添加到 HTML,但想知道最有效的方法。例如将用户添加到列表中,结果将是:
<div id="user-list" style="display:flex; flex-direction:column">
<div id="user-1">
<span class="photo" style="width:25%">PHOTO</span>
<span class="name" style="width:25%">name</span>
<span class="surname" style="width:25%">surname</span>
<span class="age" style="width:25%">age</span>
</div>
<div id="user-2">
<span class="photo" style="width:25%">PHOTO</span>
<span class="name" style="width:25%">name</span>
<span class="surname" style="width:25%">surname</span>
<span class="age" style="width:25%">age</span>
</div>
</div>
我尝试了这两种方式:
document.getElementById("user-list").innerHtml +=
`<div id="user-${userId}">
<span class="photo" style="width:25%">${userPhoto}</span>
<span class="name" style="width:25%">${userName}</span>
<span class="surname" style="width:25%">${userSurname}</span>
<span class="age" style="width:25%">${userAge}</span>
</div>`
和
var user = document.createElement("div");
user.id = `user-${userId}`
var photo = document.createElement("span");
photo.setAttribute('style','width:25%')
photo.innerHTML = userPhoto;
var name = document.createElement("span");
name.setAttribute('style','width:25%')
name.innerHTML = userName;
var surname = document.createElement("span");
surname.setAttribute('style','width:25%')
surname.innerHTML = userName;
var age = document.createElement("span");
age.setAttribute('style','width:25%')
age.innerHTML = userAge;
user.appendChild(photo);
user.appendChild(name);
user.appendChild(surname);
user.appendChild(age);
document.getElementById("user-list").appendChild(user);
它会循环创建和添加所有用户(例如 20 个用户)。
哪个更有效率?
【问题讨论】:
-
第一种方法在我看来要简单得多。
-
.innerHTML绝对不是最有效的方法。事实上,innerHTML应该避免,因为它不仅存在性能问题(HTML 解析器每次使用时都必须重建 DOM),而且还可能使您的代码暴露于注入攻击。document.createElement()可能代码更多,但性能会更好,也更安全。 -
此外,如果您正在使用不包含任何 HTML 的字符串,您绝对应该使用
.textContent而不是.innerHTML,因为.textContent不会重建 DOM(因此它的性能更好)。此外,除了这种语法:name.setAttribute('style','width:25%'),您还可以将 HTML 属性作为 JavaScript 属性访问,如下所示:name.style.width = "25%"; -
@Pranev 更简单并不总是更好。请参阅我上面关于为什么应始终避免使用
.innerHTML的评论。 -
它会比
.innerHTML好,但下面@Hewr Chelsea 关于使用template的回答可能最适合较大的标记“块”。
标签: javascript html css