Como anexar dados ao div usando JavaScript?

404

Estou usando o AJAX para anexar dados ao elemento div, onde preencho a div do JavaScript, como posso acrescentar novos dados à div sem perder os dados anteriores encontrados na div?

Adham
fonte
7
$ (div) .append (dados);
jimy
56
@jimy isso é jQuery, não há necessidade de usar isso para uma coisa tão trivial
Naftali aka Neal
2
@ Claro, mas ele também está usando AJAX, então o jQuery é definitivamente uma boa ideia!
Alnitak
3
@ Alnitak, mas como você sabe que o OP está usando o jQuery para alguma coisa?
Naftali tcp Neal
26
@Alnitak, jQuery não é a única solução ajax
Naftali aka Neal

Respostas:

585

Tente o seguinte:

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

div.innerHTML += 'Extra stuff';
Naftali tcp Neal
fonte
31
Perigo, Will Robinson! Isso adiciona HTML , não texto. Se o seu Material Extra é fornecido pelo usuário, você acabou de introduzir uma vulnerabilidade de segurança. Melhor usar a resposta de @ Chandu abaixo.
David Given
8
Sim, é uma vulnerabilidade XSS . É muito melhor criar um nó de texto com o conteúdo, como descrito na resposta abaixo.
David Given
11
Isso também não funcionaria no caso de divconter elementos com ouvintes de eventos ou entradas com texto inserido pelo usuário. Eu recomendo a resposta de Chandu .
user4642212
2
Sim, eu definitivamente não recomendo isso, pois isso destruirá o estado de qualquer caixa de seleção, ouvintes de eventos.
Kurkula
338

Usando appendChild:

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

Usando innerHTML:
Essa abordagem removerá todos os ouvintes dos elementos existentes, conforme mencionado por @BiAiB. Portanto, tenha cuidado se você planeja usar esta versão.

var theDiv = document.getElementById("<ID_OF_THE_DIV>");
theDiv.innerHTML += "<YOUR_CONTENT>"; 
Chandu
fonte
Eu uso esse método com o meu elemento "contenteditable" com a ligação angularjs e tudo funciona corretamente!
wrongite
11
Deve ser a resposta aceita de fato. Não é apenas uma maneira bonita, mas o innerHTML reconstruirá o DOM, e isso não é uma boa solução. Use appendChild ().
Jan Sverre
4
Isso é melhor, mas createTextNodenão funcionará se você estiver carregando HTML. Se você quisesse adicionar itens da lista, por exemplo, isso não funcionaria. Isso é bastante limitador.
21417 Jake
e se quisermos alterar o texto do mesmo nó de texto anexado no próximo evento?
Rahul Mishra
120

Cuidado innerHTML, você meio que perde algo ao usá-lo:

theDiv.innerHTML += 'content',     

É equivalente a:

theDiv.innerHTML = theDiv.innerHTML + 'content'

O que destruirá todos os nós dentro do seu dive recriará novos. Todas as referências e ouvintes aos elementos dentro dele serão perdidas .

Se você precisar mantê-los (quando tiver anexado um manipulador de cliques, por exemplo), será necessário anexar o novo conteúdo às funções DOM (appendChild, insertAfter, insertBefore):

var newNode = document.createElement('div');      
newNode.innerHTML = data;
theDiv.appendChild( newNode )
BiAiB
fonte
2
sim, mas isso fará com que haja um adicional div dentro da div pai que não é necessário e poder estragar alguns estilos CSS
Naftali aka Neal
@Eal, esta é apenas uma maneira de usar o appendChild. o ponto não está aqui.
BiAiB
A maneira correta de fazer isso appendChildfoi feita por @Cybernate
Naftali aka Neal
3
@ Neal não, não é. Não é correto ou incorreto. Depende apenas do que o OP precisa acrescentar: texto, código html ou algo mais.
BiAiB
11
@ Neal, é uma maneira perfeitamente boa de anexar os dados e é mais versátil do que document.createTextNode().
Alnitak
57

Se você deseja fazê-lo rapidamente e não deseja perder referências e ouvintes, use: .insertAdjacentHTML () ;

"Ele não reanalisa o elemento em que está sendo usado e, portanto , não corrompe os elementos existentes dentro do elemento. Isso evita o passo extra da serialização, tornando-o muito mais rápido do que a manipulação direta interna do HTML."

Suportado em todos os navegadores principais (IE6 +, FF8 +, Todos os outros e dispositivos móveis): http://caniuse.com/#feat=insertadjacenthenthtml

Exemplo 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
fonte
existem considerações, restrições etc. ao usar esse método?
som
11
Compatibilidade impressionante: melhor solução!
Arthur Araújo
2
Há também insertAdjacentElement()e insertAdjacentText().
nyg
Este método é a melhor solução!
Sergey NN
18

Se você estiver usando o jQuery, poderá usá $('#mydiv').append('html content')-lo e ele manterá o conteúdo existente.

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

Thomas Brasington
fonte
8

Mesmo isso irá funcionar:

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

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

Solução IE9 + (Vista +), sem criar novos nós de texto:

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

No entanto, isso não funcionou muito bem para mim, pois eu precisava de uma nova linha após cada mensagem, então meu DIV se transformou em um UL estilizado com este código:

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

De https://developer.mozilla.org/pt-BR/docs/Web/API/Node/textContent :

Diferenças do innerHTML

innerHTML retorna o HTML como o nome indica. Muitas vezes, para recuperar ou escrever texto dentro de um elemento, as pessoas usam innerHTML. textContent deve ser usado. Como o texto não é analisado como HTML, é provável que tenha um melhor desempenho. Além disso, isso evita um vetor de ataque XSS.

LGT
fonte
3

Você pode usar o jQuery. o que torna muito simples.

basta baixar o arquivo jQuery e adicionar o jQuery ao seu HTML
ou você pode acessar o link on-line:

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

e tente o seguinte:

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

O método a seguir é menos geral que outros, no entanto, é ótimo quando você tem certeza de que seu último nó filho da div já é um nó de texto. Dessa forma, você não criará um novo nó de texto usando a appendData Referência MDN 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
fonte
0

Por que não usar setAttribute?

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

Em seguida, você pode obter esses dados:

thisDiv.attrName;
thatOneGuy
fonte
Porque isso não tem nada a ver com a pergunta?
Fáze 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()sem argumentos para ver que você inseriu. Você pode usar o console do navegador para testar rapidamente essas funções antes de usá-las no seu código.

Deepu Sahni
fonte
Esta é uma cópia da resposta aceita. Por quê?
Stephen Rauch
innerHtml e html () funcionaram de maneira diferente no meu projeto. innerHtml não fez nada em um cenário. Então, acrescentou, caso seja o mesmo para qualquer outra pessoa.
Deepu Sahni