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?


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';

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>"; 

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 )

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>

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';

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.


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);

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");

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;

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.