DOMにHTML文字列を追加する


121

このHTML文字列を追加する方法

var str = '<p>Just some <span>text</span> here</p>';

'test'DOMにあるID を持つDIVに?

(Btw div.innerHTML += str;は受け入れられません。)

回答:


242

使用して、insertAdjacentHTMLそれが利用可能だと、そうでない場合は、フォールバックのいくつかの並べ替えを使用します。insertAdjacentHTML は、現在のすべてのブラウザでサポートされています

div.insertAdjacentHTML( 'beforeend', str );

ライブデモ: http : //jsfiddle.net/euQ5n/


1
@alexこれは同じ概念です。HTML文字列を解析してDOMに挿入します。しかし、機能は異なります- innerHTML文字列を要素に入れます(すべての子を置き換えます)一方insertAdjacentHTMLで、(1)要素の前、(2)要素の後、(3)最初の子の前の要素内、または(4)最後の子の後の要素内。
–ŠimeVidas、2011

3
は要素の既存の子をシリアライズして再解析しないため、@ alex insertAdjacentHTMLはに追加するよりも高速です。innerHTMLinsertAdjacentHTML
hsivonen、2011年

2
また、insertAdjacentHTML変更されたフォーム要素の値を維持しますinnerHTMLが、要素を再構築して追加すると、すべてのフォームコンテキストが失われます。
Brandon Gano 2013

20

これは受け入れられますか?

var child = document.createElement('div');
child.innerHTML = str;
child = child.firstChild;
document.getElementById('test').appendChild(child);

jsFiddle

しかしニールの答えはより良い解決策です。


1
@ŠimeDOM APIの操作は常にハックのように感じられます:P なしで 文字列のシリアル化を解除しますinnerHTMLか?
アレックス、2011

ブラウザのHTMLパーサを利用する別の方法がある場合はまあはい、私は知っているのが大好きだ...
サイムVIDAS

1
@Šime-ブラウザのHTMLパーサーを利用するには、innerHTMLとdocument.writeの2つの方法しかないと思います。そして、innerHTMLがハックであると思うなら...
Alohci

@Alohciそこ別の方法:insertAdjacentHTML
–ŠimeVidas、2011

1
@Šime-ありがとう。WHATWGバージョンを見つけました。これは、DOMの解析とシリアル化の仕様に含まれています。これは、innerHTMLとinsertAdjacentHTMLの他に、outerHTMLとcreateContextualFragmentがあることを示しています。
Alohci、2011

16

パフォーマンス

AppendChild(E)はchromeおよびsafariの他のソリューションよりも2倍以上高速insertAdjacentHTMLです。(F)はFirefoxで最も高速です。innerHTML=(B)(でない混同ん+=)A()は、すべてのブラウザ上の第二高速なソリューションであり、EとFのよりもはるかに便利です

細部

セットアップ環境(2019.07.10)MacOs High Sierra 10.13.4 on Chrome 75.0.3770(64-bit)、Safari 11.1.0(13604.5.6)、Firefox 67.0.0(64-bit)

ここに画像の説明を入力してください

  • Chrome E(140kオペレーション/秒)が最速、B(47k)とF(46k)が秒、A(332)が最も遅い
  • Firefoxでは、F(94k)が最も速く、次にB(80k)、D(73k)、E(64k)、C(21k)が最も遅いのはA(466)です。
  • Safariでは、E(207k)が最も速く、次にB(89k)、F(88k)、D(83k)、C(25k)、最も遅いのはA(509)です。

ここでマシンのテストを再生できます


12

アイデアはinnerHTML、中間要素で使用し、その子ノードのすべてを、を介して実際に必要な場所に移動することですappendChild

var target = document.getElementById('test');
var str = '<p>Just some <span>text</span> here</p>';

var temp = document.createElement('div');
temp.innerHTML = str;
while (temp.firstChild) {
  target.appendChild(temp.firstChild);
}

これにより、イベントハンドラーdiv#testが消去されるのを回避しながら、HTMLの文字列を追加できます。


3

正しい方法はを使用することinsertAdjacentHTMLです。8より前のFirefoxでは、タグが含まれていないRange.createContextualFragment場合は、使用にフォールバックできます。strscript

タグstrが含まれている場合は、フラグメントを挿入する前に、によって返されたフラグメントから要素scriptを削除する必要があります。それ以外の場合、スクリプトは実行されます。(スクリプトを実行不可としてマークします。)scriptcreateContextualFragmentinsertAdjacentHTML


言及していただきありがとうございますcreateContextualFragment 。ユーザーがCookieを設定することに同意した場合にのみスクリプトを実行してHTMLインクルードを作成する方法を探していました。
schliflo

3

クイックハック


<script>
document.children[0].innerHTML="<h1>QUICK_HACK</h1>";
</script>

ユースケース

1:.htmlファイルとして保存し、Chrome、Firefox、またはEdgeで実行します。(IEは動作しません)

2:http://js.doで使用

実行中: http : //js.do/HeavyMetalCookies/quick_hack

コメントで分解:

<script>

//: The message "QUICK_HACK" 
//: wrapped in a header #1 tag.
var text = "<h1>QUICK_HACK</h1>";

//: It's a quick hack, so I don't
//: care where it goes on the document,
//: just as long as I can see it.
//: Since I am doing this quick hack in
//: an empty file or scratchpad, 
//: it should be visible.
var child = document.children[0];

//: Set the html content of your child
//: to the message you want to see on screen.
child.innerHTML = text;

</script>

私が投稿した理由:

JS.doには2つの必須項目があります。

  1. オートコンプリートなし
  2. 垂直モニターに対応

ただし、console.logメッセージは表示されません。迅速な解決策を探してここに来ました。ほんの数行のスクラッチパッドコードの結果を確認したいだけですが、他の解決策はあまりにも働きすぎです。


1

それはなぜ受け入れられないのですか?

document.getElementById('test').innerHTML += str

それを行うための教科書的な方法でしょう。


4
それは考えのイベントハンドラを殺すに添付#testかかわらを。それは一般的に望ましくありません。
アレックス2011

それがそれをするのは興味深い。本当に論理的に見えません。
Nick Brunt

2
HTMLを文字列にシリアル化してから、HTMLを元に戻すことを考えると、当然だと思います。
アレックス2011

イベントハンドラーをリセットするには、JavaScriptを再度実行する必要があると思います。けっこうだ。
Nick Brunt、2011

1
@Nick DOMの一部を文字列化(シリアル化)して、それを別の文字列と連結し、全体を解析してDOMに戻す必要はありません。アレックスが言ったように、シリアライゼーションは(とりわけ)バインドされたイベントハンドラーを記録しません。彼のシリアライゼーションですべてをキャプチャできたとしても、それをしたくないでしょう。
–ŠimeVidas、2011

0

これで解決できます

 document.getElementById("list-input-email").insertAdjacentHTML('beforeend', '<div class=""><input type="text" name="" value="" class="" /></div>');

3
スタックオーバーフローへようこそ。回答の一部としてコードを説明し、長い1行のコードを貼り付けるだけでなく、コンテキストを提供してください。あなたはそれを理解していますが、他の人はそれが何をしているのか理解していないかもしれません。
–loan.burger

0

InnerHTMLは既存のノードのイベントのようなすべてのデータをクリアします

firstChildで子を追加すると、innerHTMLに最初の子のみが追加されます。たとえば、追加する必要がある場合:

 <p>text1</p><p>text2</p>

text1のみが表示されます

これはどうですか:

子を追加してinnerHTMLに特別なタグを追加し、作成したタグを削除してouterHTMLを編集します。それがどれほど賢いかわからないがそれは私にとってはうまくいくか、関数replaceを使用する必要がないので、outerHTMLをinnerHTMLに変更するかもしれない

function append(element, str)
{

  var child = document.createElement('someshittyuniquetag');
		
  child.innerHTML = str;

  element.appendChild(child);

  child.outerHTML = child.outerHTML.replace(/<\/?someshittyuniquetag>/, '');

// or Even child.outerHTML = child.innerHTML


  
}
<div id="testit">
This text is inside the div
<button onclick="append(document.getElementById('testit'), '<button>dadasasdas</button>')">To div</button>
<button onclick="append(this, 'some text')">to this</button>
</div>


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.