10

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

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);

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

4

2 回答 2

25

不知道你为什么要创建一个文本节点,但似乎你想创建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);
于 2013-06-23T19:05:00.513 回答
0

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

var o = document.createElement('option');
o.setAttribute('value', response.data[i].id);
o.appendChild(document.createTextNode(response.data[i].name));
msgContainer.appendChild(o);
于 2013-06-23T19:09:13.463 回答