2013-06-23 19 views
5

select要素を、ユーザーのFacebookフレンド(JSONオブジェクトとして取得)のリストとともに作成したいと考えています。私は私のHTMLに<select id="friends"></select>をハードコーディングし、JSONを解析するために、次のJavaScriptコードを使用してselect要素のoptionとして各友人を挿入します。Javascript - 複数のHTML要素を効率的に挿入する

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;&gt;の代わり<挿入していることを除いて、動作します。このおよび>。どうすれば修正できますか?純粋なJavascript(JQueryではなく)を使用して複数のHTML要素を挿入する効率的な方法がありますか?

答えて

19

テキストノードを作成する理由はわかりませんが、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); 

これは、要素を作成し、同時にプロパティを設定するためのヘルパー関数を持っていてうれしいです。

は、ここに1つの簡単な例です:いくつかの特定のニーズをカバーするために拡張することができ

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

感謝を! 1つの方法がより効率的ですか? –

+0

@ 1 '':私はここでパフォーマンスをもう一度考えることはしません。個人的には、要素を作成して同時に複数のプロパティを設定できる要素作成ヘルパ関数を作成します。 –

+1

2番目の変種は非効率的であり、非常に悪い習慣です(ループ内に要素を追加する)ので、最初のものが優先されます。 – dfsq

0

ではなく、あなたのforループでこれを試してみてください:

var o = document.createEleent('option'); 
o.setAttribute('value', response.data[i].id); 
o.appendChild(document.createTextNode(response.data[i].name)); 
msgContainer.appendChild(o); 
関連する問題