Wie füge ich Daten mit JavaScript an div an?

404

Ich verwende AJAX, um Daten an das div-Element anzuhängen, wo ich das div aus JavaScript fülle. Wie kann ich neue Daten an das div anhängen, ohne die vorherigen in div gefundenen Daten zu verlieren?

Adham
quelle
7
$ (div) .append (Daten);
Jimy
56
@ Jimy das ist jquery, keine Notwendigkeit, das für so eine triviale Sache zu verwenden
Naftali aka Neal
2
@Neal sicher, aber er benutzt auch AJAX, also ist jQuery definitiv eine gute Idee!
Alnitak
3
@Alnitak, aber woher weißt du, dass das OP jQuery für irgendetwas verwendet?
Naftali aka Neal
26
@ Alnitak, jQuery ist nicht die einzige Ajax-Lösung
Naftali aka Neal

Antworten:

585

Versuche dies:

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

div.innerHTML += 'Extra stuff';
Naftali alias Neal
quelle
31
Gefahr, Will Robinson! Dies fügt HTML hinzu , nicht Text. Wenn Ihr Extra Stuff vom Benutzer bereitgestellt wird, haben Sie gerade eine Sicherheitslücke eingeführt. Verwenden Sie besser die Antwort von @ Chandu unten.
David gegeben
8
Ja, es handelt sich um eine XSS-Sicherheitsanfälligkeit . Es ist weitaus besser, stattdessen einen Textknoten mit dem Inhalt zu erstellen, wie in der folgenden Antwort beschrieben.
David gegeben
1
Dies würde auch nicht funktionieren, wenn divElemente mit Ereignis-Listenern oder Eingaben mit vom Benutzer eingegebenem Text enthalten sind. Ich empfehle die Antwort von Chandu .
user4642212
2
Ja, ich empfehle dies definitiv nicht, da dies den Status von Kontrollkästchen und Ereignis-Listenern zerstört.
Kurkula
338

Verwenden von appendChild:

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

Verwenden von innerHTML: Bei
diesem Ansatz werden alle Listener für die vorhandenen Elemente entfernt, wie von @BiAiB erwähnt. Seien Sie also vorsichtig, wenn Sie diese Version verwenden möchten.

var theDiv = document.getElementById("<ID_OF_THE_DIV>");
theDiv.innerHTML += "<YOUR_CONTENT>"; 
Chandu
quelle
Ich benutze diese Methode mit meinem "contenteditable" -Element mit AngularJS-Bindung und alles funktioniert korrekt!
Falsch
1
Sollte in der Tat die akzeptierte Antwort sein. Nicht nur ein schöner Weg, sondern innerHTML wird das DOM neu erstellen, und das ist einfach keine gute Lösung. Verwenden Sie appendChild ().
Jan Sverre
4
Dies ist besser, createTextNodefunktioniert aber nicht, wenn Sie HTML laden. Wenn Sie beispielsweise Listenelemente hinzufügen möchten, funktioniert dies nicht. Das ist ziemlich einschränkend.
Jake
Was ist, wenn wir im nächsten Ereignis den Text desselben angehängten Textknotens ändern möchten?
Rahul Mishra
120

Vorsicht innerHTML, du verlierst etwas, wenn du es benutzt:

theDiv.innerHTML += 'content',     

Ist äquivalent zu:

theDiv.innerHTML = theDiv.innerHTML + 'content'

Dadurch werden alle Knoten in Ihrem Knoten zerstört divund neue erstellt. Alle Verweise und Listener auf darin enthaltene Elemente gehen verloren .

Wenn Sie sie behalten müssen (z. B. wenn Sie einen Klick-Handler angehängt haben), müssen Sie den neuen Inhalt an die DOM-Funktionen anhängen (appendChild, insertAfter, insertBefore):

var newNode = document.createElement('div');      
newNode.innerHTML = data;
theDiv.appendChild( newNode )
BiAiB
quelle
2
Ja, aber dies wird dazu führen, dass es ein zusätzliches Div innerhalb des übergeordneten Div gibt, das nicht benötigt wird und einige CSS-Stile durcheinander bringen könnte
Naftali aka Neal
@Neal Dies ist nur ein Beispiel für die Verwendung von appendChild. Der Punkt ist nicht hier.
BiAiB
Der richtige Weg, dies zu tun, appendChildwurde von @Cybernate
Naftali aka Neal
3
@Neal nein ist es nicht. Es ist weder richtig noch falsch. Es kommt nur darauf an, was das OP anhängen muss: Text, HTML-Code oder etwas anderes.
BiAiB
1
@Neal Dies ist eine perfekte Methode zum Anhängen der Daten und vielseitiger als document.createTextNode().
Alnitak
57

Wenn Sie es schnell machen und keine Referenzen und Listener verlieren möchten, verwenden Sie: .insertAdjacentHTML () ;

" Das Element, für das es verwendet wird, wird nicht erneut analysiert, und die vorhandenen Elemente im Element werden nicht beschädigt . Dies und die Vermeidung des zusätzlichen Serialisierungsschritts machen es viel schneller als die direkte Manipulation von innerHTML."

Unterstützt von allen Hauptbrowsern (IE6 +, FF8 +, Alle anderen und Mobilgeräte): http://caniuse.com/#feat=insertadjacenthtml

Beispiel aus 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>
Milan Rakos
quelle
Gibt es Überlegungen, Einschränkungen usw. bei der Verwendung dieser Methode?
Som
1
Tolle Kompatibilität: bessere Lösung!
Arthur Araújo
2
Es gibt auch insertAdjacentElement()und insertAdjacentText().
Nyg
Diese Methode ist die beste Lösung!
Sergey NN
18

Wenn Sie jQuery verwenden, können Sie es verwenden, $('#mydiv').append('html content')und der vorhandene Inhalt bleibt erhalten.

http://api.jquery.com/append/

Thomas Brasington
quelle
8

Auch das wird funktionieren:

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

div.innerHTML += 'Text to append';
Macfer Ann
quelle
6

IE9 + (Vista +) Lösung, ohne neue Textknoten zu erstellen:

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

Dies war jedoch nicht ganz der Trick für mich, da ich nach jeder Nachricht eine neue Zeile benötigte, sodass mein DIV mit diesem Code zu einem gestalteten UL wurde:

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

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

Unterschiede zu innerHTML

innerHTML gibt den HTML-Code zurück, wie der Name schon sagt. Sehr oft verwenden Menschen innerHTML, um Text innerhalb eines Elements abzurufen oder zu schreiben. Stattdessen sollte textContent verwendet werden. Da der Text nicht als HTML analysiert wird, ist die Leistung wahrscheinlich besser. Darüber hinaus wird dadurch ein XSS-Angriffsvektor vermieden.

LGT
quelle
3

Sie können jQuery verwenden. das macht es sehr einfach.

Laden Sie einfach die jQuery-Datei herunter und fügen Sie jQuery in Ihren HTML-Code ein,
oder Sie können den Online-Link verwenden:

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

und versuchen Sie dies:

 $("#divID").append(data);
Vishnu Mishra
quelle
1

Die folgende Methode ist weniger allgemein als andere. Sie ist jedoch hilfreich, wenn Sie sicher sind, dass Ihr letzter untergeordneter Knoten des div bereits ein Textknoten ist. Auf diese Weise erstellen Sie keinen neuen Textknoten mit appendData MDN Reference 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");
Umbert
quelle
0

Warum nicht einfach setAttribute verwenden?

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

Dann können Sie diese Daten erhalten von:

thisDiv.attrName;
thatOneGuy
quelle
Weil das nichts mit der Frage zu tun hat?
FaZe Unempl0yedd
-1

Java-Skript

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

jquery

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

Verwenden Sie .html()ohne Argumente, um zu sehen, dass Sie eingegeben haben. Sie können die Browserkonsole verwenden, um diese Funktionen schnell zu testen, bevor Sie sie in Ihrem Code verwenden.

Deepu Sahni
quelle
Dies ist eine Kopie der akzeptierten Antwort untereinander. Warum?
Stephen Rauch
innerHtml und html () haben in meinem Projekt unterschiedlich funktioniert. innerHtml hat in einem Szenario nichts getan. Also fügte es hinzu, falls es für andere gleich ist.
Deepu Sahni