Comment ajouter des données à div en utilisant JavaScript?

405

J'utilise AJAX pour ajouter des données à l'élément div, où je remplis le div à partir de JavaScript, comment puis-je ajouter de nouvelles données au div sans perdre les données précédentes trouvées dans div?

Adham
la source
7
$ (div) .append (données);
jimy
56
@jimy thats jquery, pas besoin de l'utiliser pour une chose aussi banale
Naftali aka Neal
2
@Neal bien sûr, mais il utilise aussi AJAX, donc jQuery est définitivement une bonne idée!
Alnitak
3
@Alnitak, mais comment savez-vous que l'OP utilise jQuery pour quoi que ce soit?
Naftali aka Neal
26
@Alnitak, jQuery n'est pas la seule solution ajax
Naftali aka Neal

Réponses:

586

Essaye ça:

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

div.innerHTML += 'Extra stuff';
Naftali aka Neal
la source
31
Danger, Will Robinson! Cela ajoute du HTML , pas du texte. Si votre Extra Stuff est fourni par l'utilisateur, vous venez d'introduire une vulnérabilité de sécurité. Mieux vaut utiliser la réponse de @ Chandu ci-dessous.
David Given
8
Oui, c'est une vulnérabilité XSS . Il vaut mieux créer un nœud de texte avec le contenu à la place, comme décrit dans la réponse ci-dessous.
David Given
1
Cela ne fonctionnera pas non plus si divdes éléments contiennent des écouteurs d'événements ou des entrées avec du texte saisi par l'utilisateur. Je recommande la réponse de Chandu .
user4642212
2
Oui, je ne le recommande absolument pas, car cela détruirait l'état des cases à cocher, des écouteurs d'événements.
Kurkula
339

Utiliser appendChild:

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

Utilisation de innerHTML:
Cette approche supprimera tous les écouteurs des éléments existants comme mentionné par @BiAiB. Soyez donc prudent si vous prévoyez d'utiliser cette version.

var theDiv = document.getElementById("<ID_OF_THE_DIV>");
theDiv.innerHTML += "<YOUR_CONTENT>"; 
Chandu
la source
J'utilise cette méthode avec mon élément "contenteditable" avec la liaison angularjs, et tout fonctionne correctement!
falseite
1
Devrait être la réponse acceptée en effet. Non seulement une belle façon, mais innerHTML reconstruira le DOM, et ce n'est tout simplement pas une bonne solution. Utilisez appendChild ().
Jan Sverre
4
C'est mieux, mais createTextNodene fonctionnera pas si vous chargez du HTML. Si vous souhaitez ajouter des éléments de liste, par exemple, cela ne fonctionnera pas. C'est assez limitatif.
Jake
que se passe-t-il si nous voulons changer le texte du même nœud de texte ajouté lors du prochain événement?
Rahul Mishra
120

Attention innerHTML, vous perdez en quelque sorte quelque chose lorsque vous l'utilisez:

theDiv.innerHTML += 'content',     

Est équivalent à:

theDiv.innerHTML = theDiv.innerHTML + 'content'

Ce qui détruira tous les nœuds à l'intérieur du vôtre divet en recréera de nouveaux. Toutes les références et tous les écouteurs des éléments qu'il contient seront perdus .

Si vous devez les conserver (lorsque vous avez attaché un gestionnaire de clic, par exemple), vous devez ajouter le nouveau contenu avec les fonctions DOM (appendChild, insertAfter, insertBefore):

var newNode = document.createElement('div');      
newNode.innerHTML = data;
theDiv.appendChild( newNode )
BiAiB
la source
2
oui, mais cela entraînera une division supplémentaire à l'intérieur de la division parent qui n'est pas nécessaire et pourrait gâcher certains styles CSS
Naftali aka Neal
@Neal, ce n'est qu'un exemple d'utilisation d'AppendChild. le point n'est pas là.
BiAiB
La bonne façon de le faire a appendChildété faite par @Cybernate
Naftali aka Neal
3
@Neal non ce n'est pas. Ce n'est ni correct ni incorrect. Cela dépend simplement de ce que l'OP doit ajouter: du texte, du code html ou autre chose.
BiAiB
1
@Neal, c'est un excellent moyen d'ajouter des données et est plus polyvalent que document.createTextNode().
Alnitak
57

Si tu veux le faire rapidement et ne voulez pas perdre de références et d'écouteurs, utilisez: .insertAdjacentHTML () ;

"Il n'analyse pas l'élément il est utilisé et ne corrompt donc pas les éléments existants à l'intérieur de l'élément. Cela, et en évitant l'étape supplémentaire de sérialisation, le rend beaucoup plus rapide que la manipulation directe en HTML interne."

Pris en charge sur tous les navigateurs principaux (IE6 +, FF8 +, tous les autres et mobiles): http://caniuse.com/#feat=insertadjacenthtml

Exemple de 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
la source
y a-t-il des considérations, des contraintes, etc. lors de l'utilisation de cette méthode?
som
1
Compatibilité impressionnante: meilleure solution!
Arthur Araújo
2
Il y a aussi insertAdjacentElement()et insertAdjacentText().
nyg
Cette méthode est la meilleure solution!
Sergey NN
8

Même cela fonctionnera:

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

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

Solution IE9 + (Vista +), sans créer de nouveaux nœuds de texte:

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

Cependant, cela n'a pas tout à fait fait l'affaire pour moi car j'avais besoin d'une nouvelle ligne après chaque message, alors ma DIV s'est transformée en une UL stylisée avec ce code:

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

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

Différences avec innerHTML

innerHTML renvoie le HTML comme son nom l'indique. Très souvent, pour récupérer ou écrire du texte dans un élément, les gens utilisent innerHTML. textContent doit être utilisé à la place. Étant donné que le texte n'est pas analysé en HTML, il est susceptible d'avoir de meilleures performances. De plus, cela évite un vecteur d'attaque XSS.

LGT
la source
3

vous pouvez utiliser jQuery. ce qui le rend très simple.

il suffit de télécharger le fichier jQuery, d'ajouter jQuery dans votre code HTML
ou vous pouvez utiliser un lien en ligne:

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

et essayez ceci:

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

La méthode suivante est moins générale que les autres, mais elle est idéale lorsque vous êtes sûr que votre dernier nœud enfant de la div est déjà un nœud de texte. De cette façon, vous ne créerez pas de nouveau nœud de texte à l'aide de 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
la source
0

Pourquoi ne pas simplement utiliser setAttribute?

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

Ensuite, vous pouvez obtenir ces données en:

thisDiv.attrName;
thatOneGuy
la source
Parce que cela n'a rien à voir avec la question?
FaZe Unempl0yedd
-1

script java

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

jquery

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

Utilisez .html()sans aucun argument pour voir que vous avez entré. Vous pouvez utiliser la console du navigateur pour tester rapidement ces fonctions avant de les utiliser dans votre code.

Deepu Sahni
la source
Ceci est une copie de la réponse acceptée. Pourquoi?
Stephen Rauch
innerHtml et html () ont fonctionné différemment sur mon projet. innerHtml n'a rien fait dans un scénario. Alors l'ajoute, au cas où c'est la même chose pour quelqu'un d'autre.
Deepu Sahni