2017-01-21 4 views
3

DocumentFragmentのポイントは、準備が整うまでDOMに触れることなくコンテンツを構築できることです。JavaScript:DocumentFragmentにノードをコピーする

DocumentFragmentがinnerHTMLをサポートしていないとすれば、ちょっと面倒なことがあります。一方、一度構築されると、断片自体によって既存のDOMノードにコンテンツを追加するのは簡単です。

divをDOMに追加せずに作成した場合は、innerHTMLなど、好きなように設定することができます。私が知る限り、パフォーマンスには何の影響もありません。

既存のDOMノードの内容をDocumentFragmentにコピーする簡単な方法(つまり1行程度)はありますか?プロセスは次のようになります。

var div=document.createElement('div'); 
var fragment=document.createDocumentFragment(); 
div.innerHTML='…'; 
// copy contents to fragment 
// etc 

このようにして、私は両方の世界で最高の結果を得ることができました。

ここで回答

を例に組み込ま以下@KevBotによって答えは:

var divTest=document.querySelector('div#test'); 

var html='<p>One</p><p>Two</p>'; 
var fragment=document.createRange().createContextualFragment(html); 

divTest.appendChild(fragment); 
+0

私はこの質問が気に入っていますが、これらの解決策のいくつかはあいまいなJavaScriptを実装しています。 – zer00ne

+0

* divにDOMを追加せずにdivを作成した場合、innerHTMLを含めて好きなように埋め込むことができます。 * divとdocFragの違いは、DOMにdivを追加すると、divに追加したすべてのものがそこに残ることです。 docFragを使用すると、それをDOMに追加します。追加したものはすべてDOMにありますが、docFragはDOMにありません。あなたはテーブルクロスを引き出してテーブルの上に置いておくと、そのテーブルクロスのトリックが好きです。 – zer00ne

答えて

3

.contentプロパティを使用してtemplate要素の.innerHTMLを取得はい、あなたは簡単にdocument.createRangeメソッドを使用してHTMLの文字列を使用してフラグメントを作成することができます。

document.createRangeはオブジェクトを返します。このオブジェクトにはcreateContextualFragmentというメソッドがあり、HTMLからフラグメントを取得できます。

function fragmentFromString(strHTML) { 
 
    return document.createRange().createContextualFragment(strHTML); 
 
} 
 

 
let div = document.createElement('div'); 
 
div.innerHTML = '<p>Testing</p>'; 
 

 
let fragment = fragmentFromString(div.innerHTML); 
 
console.log(fragment);
<div> 
 
    <p>Random Content</p> 
 
</div>

すべての主要なブラウザとIE11で動作します。

+0

答えに感謝します。それはIE11で動作するという事実は、少し細かくカットしていますが、とにかく残りの部分については誰が気にしていますか?私はあなたの例を反映するために私の質問の例を修正しました。 – Manngo

+0

ようこそ。ええ、マイクロソフトでさえ、現在のところie10以下のサポートを断念しています。 – KevBot

1

あなたがフラグメントに新しい要素を追加するためにappendChildを使用することができます。

var div=document.createElement('div'); 
var fragment=document.createDocumentFragment(); 
div.innerHTML='…'; 

fragment.appendChild(div); 

あなただけ、あなたはchildNodesを反復し、フラグメントにそれらを挿入することができますフラグメントに要素の内容を注入します。

div.childNodes.forEach(function(node) { 
    fragment.appendChild(node); 
}); 
+0

答えに感謝しますが、私は 'div'自体を望んでいません。ちょうど内容。 – Manngo

+0

'childNodes'プロパティを使用して、各ノードを反復してフラグメントに注入することができます。 'div.childNodes.forEach(function(node){ fragment.appendChild(node); });' –

1

サイズのためにこれらを試してみてください

text = frag.appendChild(document.createTextNode("insert text here")) 

または

text = frag.appendChild(document.createTextNode(div.innerHTML)) 

または

あなたはまた、すべてのtextnodeを付加しているが
text = frag.appendChild(document.createTextNode(div.textContent)) 

text変数がtextnodeを開催します1行に

3

文書の一部である<template>要素を作成できます。 .innerHTMLtemplateの要素を設定し、

var template = document.createElement("template"); 
 
var div = document.createElement("div"); 
 
div.innerHTML = "<p>abc</p>"; 
 
template.innerHTML = div.innerHTML; 
 
document.body.appendChild(template.content);

関連する問題