¿Cómo agregar datos a div usando JavaScript?

405

Estoy usando AJAX para agregar datos al elemento div, donde lleno el div desde JavaScript, ¿cómo puedo agregar nuevos datos al div sin perder los datos anteriores encontrados en div?

Adham
fuente
77
$ (div) .append (datos);
jimy
56
@jimy eso es jquery, no hay necesidad de usar eso para algo tan trivial
Naftali aka Neal
2
@Neal seguro, pero también está usando AJAX, ¡así que jQuery es definitivamente una buena idea!
Alnitak
3
@Alnitak, pero ¿cómo sabes que el OP está usando jQuery para algo?
Naftali aka Neal
26
@Alnitak, jQuery no es la única solución ajax
Naftali aka Neal

Respuestas:

586

Prueba esto:

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

div.innerHTML += 'Extra stuff';
Naftali aka Neal
fuente
31
¡Peligro, Will Robinson! Esto agrega HTML , no texto. Si el usuario proporciona su material adicional, acaba de introducir una vulnerabilidad de seguridad. Es mejor usar la respuesta de @ Chandu a continuación.
David dado
8
Sí, es una vulnerabilidad XSS . Es mejor crear un nodo de texto con el contenido, como se describe en la respuesta a continuación.
David dado el
1
Esto tampoco funcionará en caso de que divcontenga elementos con escuchas de eventos o entradas con texto ingresado por el usuario. Recomiendo la respuesta de Chandu .
user4642212
2
Sí, definitivamente no lo recomiendo, ya que esto destruirá el estado de las casillas de verificación y los oyentes de eventos.
Kurkula
339

Usando appendChild:

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

Uso de innerHTML:
este enfoque eliminará a todos los oyentes de los elementos existentes mencionados por @BiAiB. Por lo tanto, tenga cuidado si planea usar esta versión.

var theDiv = document.getElementById("<ID_OF_THE_DIV>");
theDiv.innerHTML += "<YOUR_CONTENT>"; 
Chandu
fuente
¡Uso este método con mi elemento "contenteditable" con enlace angularjs, y todo funciona correctamente!
wrongite
1
Debería ser la respuesta aceptada de hecho. No solo es una forma hermosa, sino que innerHTML reconstruirá el DOM, y esa no es una buena solución. Use appendChild ().
Jan Sverre
44
Esto es mejor, pero createTextNodeno funcionará si está cargando HTML. Si quisiera agregar elementos de la lista, por ejemplo, esto no funcionaría. Eso es bastante limitante.
Jake
¿Qué pasa si queremos cambiar el texto del mismo nodo de texto agregado en el próximo evento?
Rahul Mishra
120

Cuidado innerHTML, pierdes algo cuando lo usas:

theDiv.innerHTML += 'content',     

Es equivalente a:

theDiv.innerHTML = theDiv.innerHTML + 'content'

Lo cual destruirá todos los nodos dentro de usted divy recreará otros nuevos. Se perderán todas las referencias y oyentes a los elementos que contiene .

Si necesita conservarlos (cuando ha adjuntado un controlador de clics, por ejemplo), debe agregar los nuevos contenidos con las funciones DOM (appendChild, insertAfter, insertBefore):

var newNode = document.createElement('div');      
newNode.innerHTML = data;
theDiv.appendChild( newNode )
BiAiB
fuente
2
Sí, pero esto provocará que haya un div adicional dentro del div principal que no es necesario y podría estropear algunos estilos CSS
Naftali aka Neal
@Neal esta es solo una forma de ejemplo de usar appendChild. El punto no está aquí.
BiAiB
appendChild@Cybernate hizo la forma correcta de hacerlo
Naftali, también conocido como Neal, el
3
@Neal no, no lo es. No es ni correcto ni incorrecto. Solo depende de lo que el OP necesita agregar: texto, código html u otra cosa.
BiAiB
1
@Neal esta es una forma perfectamente buena de agregar los datos, y es más versátil que document.createTextNode().
Alnitak
57

Si quiere hacerlo rápido y no quiere perder referencias y los oyentes usan: .insertAdarestHTML () ;

"No vuelve a analizar el elemento en el que se está utilizando y, por lo tanto , no corrompe los elementos existentes dentro del elemento. Esto y evitar el paso adicional de serialización lo hace mucho más rápido que la manipulación directa de innerHTML".

Compatible con todos los navegadores principales (IE6 +, FF8 +, Todos los demás y dispositivos móviles): http://caniuse.com/#feat=insertadaresthtml

Ejemplo de https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdarestHTML

// <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
fuente
¿Hay alguna consideración, restricción, etc. al usar este método?
som
1
Impresionante compatibilidad: ¡mejor solución!
Arthur Araújo
2
También hay insertAdjacentElement()y insertAdjacentText().
nyg
¡Este método es la mejor solución!
Sergey NN
8

Incluso esto funcionará:

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

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

Solución IE9 + (Vista +), sin crear nuevos nodos de texto:

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

Sin embargo, esto no fue suficiente para mí, ya que necesitaba una nueva línea después de cada mensaje, por lo que mi DIV se convirtió en un UL con este código:

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

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

Diferencias de innerHTML

innerHTML devuelve el HTML como su nombre lo indica. Muy a menudo, para recuperar o escribir texto dentro de un elemento, las personas usan innerHTML. textContent debe usarse en su lugar. Debido a que el texto no se analiza como HTML, es probable que tenga un mejor rendimiento. Además, esto evita un vector de ataque XSS.

LGT
fuente
3

puedes usar jQuery. que lo hacen muy simple

simplemente descargue el archivo jQuery, agregue jQuery a su HTML
o puede usar el enlace en línea:

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

y prueba esto:

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

El siguiente método es menos general que otros, sin embargo, es excelente cuando está seguro de que su último nodo secundario del div ya es un nodo de texto. De esta manera, no creará un nuevo nodo de texto utilizando 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
fuente
0

¿Por qué no solo usar setAttribute?

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

Entonces puede obtener estos datos de la siguiente manera:

thisDiv.attrName;
thatOneGuy
fuente
¿Porque eso no tiene nada que ver con la pregunta?
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");

Use .html()sin ningún argumento para ver que ha ingresado. Puede usar la consola del navegador para probar rápidamente estas funciones antes de usarlas en su código.

Deepu Sahni
fuente
Esta es una copia de la respuesta aceptada entre sí. ¿Por qué?
Stephen Rauch
innerHtml y html () funcionaron de manera diferente en mi proyecto. innerHtml no hizo nada en un escenario. Así que lo agregó, en caso de que sea lo mismo para cualquier otra persona.
Deepu Sahni