Javascript - 有效地插入多个 HTML 元素

Posted

技术标签:

【中文标题】Javascript - 有效地插入多个 HTML 元素【英文标题】:Javascript - efficiently insert multiple HTML elements 【发布时间】:2013-06-20 07:02:16 【问题描述】:

我想创建一个select 元素,其中包含用户的 Facebook 好友列表(作为 JSON 对象获得)。我将 <select id="friends"></select> 硬编码到我的 html 中,然后使用以下 javascript 代码解析 JSON 并将每个朋友插入为 select 元素的 option

var msgContainer = document.createDocumentFragment();
for (var i = 0; i < response.data.length; i++)  
    msgContainer.appendChild(document.createTextNode('<option value="'+response.data[i].id+'">'+response.data[i].name+'</option>'));    

document.getElementById("friends").appendChild(msgContainer);

这几乎可以工作,除了它插入&amp;lt;&amp;gt; 而不是&lt;&gt;。我该如何解决它,是否有更有效的方法来使用纯 Javascript(而不是 JQuery)插入多个 HTML 元素?

【问题讨论】:

【参考方案1】:

不确定您为什么要创建文本节点,但您似乎想要创建 option 元素,因此您可以改用 Option 构造函数。

var msgContainer = document.createDocumentFragment();

for (var i = 0; i < response.data.length; i++)  
    msgContainer.appendChild(new Option(response.data[i].name, response.data[i].id));

document.getElementById("friends").appendChild(msgContainer);

或者你可以使用通用的document.createElement()

var msgContainer = document.createDocumentFragment();

for (var i = 0; i < response.data.length; i++) 
    var option = msgContainer.appendChild(document.createElement("option"));
    option.text = response.data[i].name;
    option.value = response.data[i].id;

document.getElementById("friends").appendChild(msgContainer);

很高兴有一个辅助函数来同时创建元素和设置属性。

这是一个简单的例子:

function create(name, props) 
    var el = document.createElement(name);
    for (var p in props)
        el[p] = props[p];
    return el;

它可以扩展以满足某些特定需求,但这适用于大多数情况。

你会这样使用它:

var msgContainer = document.createDocumentFragment();

for (var i = 0; i < response.data.length; i++) 
    msgContainer.appendChild(create("option", 
        text: response.data[i].name,
        value: response.data[i].id
    ));

document.getElementById("friends").appendChild(msgContainer);

【讨论】:

谢谢!一种方法更有效吗? @1'':我不会再考虑性能了。就个人而言,我会创建一个元素创建器辅助函数,让您可以创建任何元素并同时设置一堆属性。 第二个变体效率低下而且非常糟糕(在循环中附加元素),所以首选第一个。 感谢@dfsq 的澄清! 该死,我的错!你是对的,这是我的一天。无论如何,我赞成你的回答,所以没有冒犯:)【参考方案2】:

在你的 for 循环中试试这个:

var o = document.createElement('option');
o.setAttribute('value', response.data[i].id);
o.appendChild(document.createTextNode(response.data[i].name));
msgContainer.appendChild(o);

【讨论】:

以上是关于Javascript - 有效地插入多个 HTML 元素的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中有效地将数据插入 MySQL 中的多个表中

如何有效地为许多产品提供 1 个 html 布局页面,这些产品将调用 mysql 数据库获取产品信息并插入我指定的位置?

Spring data jpa 插入多个表以避免锁定表

在运行剩余的 javascript 之前检查有效的电子邮件

如何有效地将元素插入数组的任意位置?

使用集合存储自定义类,只有第一个插入有效