JavaScriptを使用してdivにデータを追加する方法


404

AJAXを使用してdiv要素にデータを追加しています。JavaScriptからdivにデータを入力します。divにある以前のデータを失うことなく、divに新しいデータを追加するにはどうすればよいですか?


7
$(div).append(data);
ジミー

56
@jimy thats jquery、それをそのような些細なことのために使用する必要はありません
Naftali aka Neal

2
@ニールは確かですが、彼もAJAXを使用しているので、jQueryは間違いなく良いアイデアです。
Alnitak

3
@Alnitak、しかし、OPが何かのためにjQueryを使用していることをどうやって知っていますか?
Naftali別名Neal

26
@ Alnitak、jQueryが唯一の ajaxソリューションではありません
Naftali別名Neal

回答:


585

これを試して:

var div = document.getElementById('divID');

div.innerHTML += 'Extra stuff';

31
危険、ウィル・ロビンソン!これにより、テキストではなくHTMLが追加されます。ユーザーによって追加の情報が提供された場合、セキュリティの脆弱性が発生しました。以下の@Chanduの回答を使用することをお勧めします。
デビッドギヴン

8
はい、これはXSSの脆弱性です。以下の回答で説明するように、代わりにコンテンツを含むテキストノードを作成する方がはるかに優れています。
デビッドギヴン

1
これdivは、イベントリスナーを含む要素やユーザーが入力したテキストを含む入力が含まれている場合にも機能しません。チャンドゥ答えをお勧めします
user4642212 2016


2
はい、これはチェックボックスやイベントリスナーの状態を破壊するため、絶対にお勧めしません。
Kurkula

338

appendChildの使用:

var theDiv = document.getElementById("<ID_OF_THE_DIV>");
var content = document.createTextNode("<YOUR_CONTENT>");
theDiv.appendChild(content);

innerHTMLの使用:
このアプローチでは、@ BiAiBで言及されているように、既存の要素に対するすべてのリスナーが削除されます。したがって、このバージョンを使用する予定がある場合は注意してください。

var theDiv = document.getElementById("<ID_OF_THE_DIV>");
theDiv.innerHTML += "<YOUR_CONTENT>"; 

angularjsバインディングを使用した「contenteditable」要素でこのメソッドを使用すると、すべてが正しく機能します。
16

1
確かに受け入れられる答えでなければなりません。美しい方法だけでなく、innerHTMLはDOMを再構築しますが、それは良い解決策ではありません。appendChild()を使用します。
Jan Sverre 2017

4
これは優れていcreateTextNodeますが、HTMLをロードしている場合は機能しません。たとえば、リストアイテムを追加する場合、これは機能しません。それはかなり制限されています。
ジェイク

次のイベントで同じ追加テキストノードのテキストを変更したい場合はどうなりますか?
Rahul Mishra 2018年

120

に注意してくださいinnerHTML、あなたがそれを使うとき、あなたは一種の何かを失います:

theDiv.innerHTML += 'content',     

以下と同等です。

theDiv.innerHTML = theDiv.innerHTML + 'content'

これにより、内部のすべてのノードが破棄され、div新しいノードが再作成されます。その内部の要素へのすべての参照とリスナーは失われます。

それらを保持する必要がある場合(たとえば、クリックハンドラーをアタッチした場合)、新しいコンテンツをDOM関数(appendChild、insertAfter、insertBefore)に追加する必要があります。

var newNode = document.createElement('div');      
newNode.innerHTML = data;
theDiv.appendChild( newNode )

2
はい、しかしこれは親div内に余分な div が存在する原因となり、不要なCSSスタイルを混乱させる可能性があります
Naftali aka Neal

@Nealこれは、appendChildの使用例の1つにすぎません。ポイントはここではありません。
BiAiB

これを行う正しい方法は、appendChild@ Cyber​​nateによって行われました
Naftali別名Neal

3
@ニールいいえ、そうではありません。それは正しくも正しくもありません。それは、OPが追加する必要があるもの(テキスト、HTMLコードなど)に依存します。
BiAiB

1
@Nealは、データを追加するのに最適な方法であり、よりも用途が広いですdocument.createTextNode()
アルニタク

57

高速に実行したいが、参照とリスナーを失いたくない場合は、.insertAdjacentHTML()を使用します。

「使用されている要素を再解析しないため、要素内の既存の要素が破損することはありません。これにより、シリアル化の余分な手順を回避することで、innerHTMLを直接操作するよりはるかに高速になります。」

すべてのメインラインブラウザー(IE6 +、FF8 +、その他すべて、およびモバイル)でサポート:http ://caniuse.com/#feat=insertadjacenthtml

https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTMLの

// <div id="one">one</div>
var d1 = document.getElementById('one');
d1.insertAdjacentHTML('afterend', '<div id="two">two</div>');

// At this point, the new structure is:
// <div id="one">one</div><div id="two">two</div>

この方法を使用する際の考慮事項、制約などはありますか?
som

1
素晴らしい互換性:より良いソリューション!
ArthurAraújo2016

2
ともinsertAdjacentElement()ありinsertAdjacentText()ます。
nyg 2017


この方法が最善の解決策です!
セルゲイNN



6

新しいテキストノードを作成しないIE9 +(Vista +)ソリューション:

var div = document.getElementById("divID");
div.textContent += data + " ";

ただし、メッセージごとに新しい行が必要だったので、これは私にとってはうまくいかなかったので、DIVは次のコードでスタイル付きULに変わりました。

var li = document.createElement("li");
var text = document.createTextNode(data);
li.appendChild(text);
ul.appendChild(li);

https://developer.mozilla.org/en-US/docs/Web/API/Node/textContentから:

innerHTMLとの違い

innerHTMLは、その名前が示すとおりにHTMLを返します。多くの場合、要素内のテキストを取得または書き込むために、innerHTMLを使用します。代わりにtextContentを使用する必要があります。テキストはHTMLとして解析されないため、パフォーマンスが向上する可能性があります。さらに、これによりXSS攻撃ベクトルが回避されます。


3

jQueryを使用できます。それはそれを非常に簡単にします。

jQueryファイルをダウンロードして、jQueryをHTMLに追加する
か、オンラインリンクを使用できます。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>

これを試してください:

 $("#divID").append(data);

1

次のメソッドは他のメソッドよりも一般的ではありませんが、divの最後の子ノードがすでにテキストノードであることが確実な場合に最適です。この方法では、MDNリファレンスAppendDataを使用して新しいテキストノードを作成しません。appendData

let mydiv = document.getElementById("divId");
let lastChild = mydiv.lastChild;

if(lastChild && lastChild.nodeType === Node.TEXT_NODE ) //test if there is at least a node and the last is a text node
   lastChild.appendData("YOUR TEXT CONTENT");

0

なぜsetAttributeを使用しないのですか?

thisDiv.setAttribute('attrName','data you wish to append');

その後、次の方法でこのデータを取得できます。

thisDiv.attrName;

それは質問とは何の関係もないのですか?
FaZe Unempl0yedd

-1

Javaスクリプト

document.getElementById("divID").html("this text will be added to div");

jquery

$("#divID").html("this text will be added to div");

.html()引数なしで使用して、入力したことを確認します。これらの関数をコードで使用する前に、ブラウザーコンソールを使用してこれらの関数をすばやくテストできます。


これは、相互に受け入れられた回答のコピーです。どうして?
スティーブンラウフ2017

innerHtmlとhtml()は、私のプロジェクトでは異なる動作をしました。innerHtmlは1つのシナリオで何もしませんでした。他の誰にとっても同じ場合に備えて、それを追加しました。
Deepu Sahni 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.