Come aggiungere dati al div usando JavaScript?


405

Sto usando AJAX per aggiungere dati all'elemento div, dove riempio il div da JavaScript, come posso aggiungere nuovi dati al div senza perdere i dati precedenti trovati nel div?


7
$ (div) .Append (i dati);
jimy,

56
@jimy questo è jquery, non c'è bisogno di usarlo per una cosa così banale
Naftali aka Neal

2
@Neal certo, ma sta usando anche AJAX, quindi jQuery è sicuramente una buona idea!
Alnitak,

3
@Alnitak, ma come fai a sapere che OP utilizza jQuery per qualsiasi cosa?
Naftali aka Neal,

26
@Alnitak, jQuery non è l' unica soluzione ajax
Naftali aka Neal,

Risposte:


586

Prova questo:

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

div.innerHTML += 'Extra stuff';

31
Pericolo, Will Robinson! Questo aggiunge HTML , non testo. Se la tua roba extra è fornita dall'utente, hai appena introdotto una vulnerabilità di sicurezza. Meglio usare la risposta di @ Chandu di seguito.
David, dato il

8
Sì, è una vulnerabilità XSS . È molto meglio creare un nodo di testo con il contenuto, come descritto nella risposta di seguito.
David, dato il

1
Anche questo non funzionerebbe nel caso divcontenga elementi con listener di eventi o input con testo inserito dall'utente. Consiglio la risposta di Chandu .
user4642212


2
Sì, sicuramente non lo consiglio in quanto ciò distruggerà lo stato di eventuali caselle di controllo, listener di eventi.
Kurkula,

339

Utilizzando appendChild:

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

Uso di innerHTML:
questo approccio rimuoverà tutti gli ascoltatori dagli elementi esistenti, come indicato da @BiAiB. Quindi fai attenzione se hai intenzione di usare questa versione.

var theDiv = document.getElementById("<ID_OF_THE_DIV>");
theDiv.innerHTML += "<YOUR_CONTENT>"; 

Uso questo metodo con il mio elemento "contenteditable" con rilegatura angularjs e tutto funziona correttamente!
torto

1
Dovrebbe essere la risposta accettata davvero. Non solo un modo meraviglioso, ma innerHTML ricostruirà il DOM, e questa non è una buona soluzione. Usa appendChild ().
Jan Sverre,

4
Questo è meglio, ma createTextNodenon funzionerà se stai caricando HTML. Se si desidera aggiungere voci di elenco, ad esempio, questo non funzionerebbe. Questo è piuttosto limitante.
Jake,

cosa succede se vogliamo cambiare il testo dello stesso nodo di testo aggiunto nel prossimo evento?
Rahul Mishra

120

Attenzione innerHTML, perdi qualcosa quando lo usi:

theDiv.innerHTML += 'content',     

È equivalente a:

theDiv.innerHTML = theDiv.innerHTML + 'content'

Che distruggerà tutti i nodi dentro di te dive ne creerà di nuovi. Tutti i riferimenti e gli ascoltatori degli elementi al suo interno andranno persi .

Se è necessario mantenerli (quando è stato collegato un gestore di clic, ad esempio), è necessario aggiungere i nuovi contenuti con le funzioni DOM (appendChild, insertAfter, insertBefore):

var newNode = document.createElement('div');      
newNode.innerHTML = data;
theDiv.appendChild( newNode )

2
sì, ma questo causerà un div extra all'interno del div parent che non è necessario e potrebbe rovinare alcuni stili css
Naftali aka Neal

@Neal questo è solo un modo di esempio per usare appendChild. il punto non è qui.
BiAiB,

Il modo corretto di fare ciò è appendChildstato fatto da @Cybernate
Naftali aka Neal

3
@Neal no non lo è. Non è né corretto né errato. Dipende solo da ciò che l'OP deve aggiungere: testo, codice html o qualcos'altro.
BiAiB,

1
@Neal questo è un ottimo modo per aggiungere i dati ed è più versatile di document.createTextNode().
Alnitak,

57

Se vuoi farlo velocemente e non vuoi perdere riferimenti e gli ascoltatori usano: .insertAdjacentHTML () ;

"Non analizza l'elemento su cui viene utilizzato e quindi non danneggia gli elementi esistenti all'interno dell'elemento. Questo, evitando il passaggio aggiuntivo di serializzazione, lo rende molto più veloce della manipolazione diretta di HTMLHTML."

Supportato su tutti i browser principali (IE6 +, FF8 +, Tutti gli altri e Mobile): http://caniuse.com/#feat=insertadjacenthtml

Esempio da 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>

ci sono considerazioni, vincoli, ecc. quando si utilizza questo metodo?
som

1
Straordinaria compatibilità: soluzione migliore!
Arthur Araújo,

2
C'è anche insertAdjacentElement()e insertAdjacentText().
nyg


Questo metodo è la soluzione migliore!
Sergey NN,


8

Anche questo funzionerà:

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

div.innerHTML += 'Text to append';

6

Soluzione IE9 + (Vista +), senza creare nuovi nodi di testo:

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

Tuttavia, questo non ha funzionato bene per me poiché avevo bisogno di una nuova riga dopo ogni messaggio, quindi il mio DIV si è trasformato in un UL in stile con questo codice:

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

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

Differenze rispetto a innerHTML

innerHTML restituisce l'HTML come indica il nome. Abbastanza spesso, al fine di recuperare o scrivere testo all'interno di un elemento, le persone usano innerHTML. In alternativa, si dovrebbe usare textContent. Poiché il testo non viene analizzato come HTML, è probabile che abbia prestazioni migliori. Inoltre, questo evita un vettore di attacco XSS.


3

puoi usare jQuery. che lo rendono molto semplice.

basta scaricare il file jQuery aggiungere jQuery nel proprio HTML
oppure è possibile il collegamento online dell'utente:

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

e prova questo:

 $("#divID").append(data);

1

Il seguente metodo è meno generale di altri, tuttavia è ottimo quando sei sicuro che l'ultimo nodo figlio del div sia già un nodo di testo. In questo modo non creerai un nuovo nodo di testo usando appendData AppendData di riferimento MDN

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

Perché non usare solo setAttribute?

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

Quindi è possibile ottenere questi dati:

thisDiv.attrName;

Perché questo non ha nulla a che fare con la domanda?
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");

Usa .html()senza alcun argomento per vedere che hai inserito. Puoi utilizzare la console del browser per testare rapidamente queste funzioni prima di utilizzarle nel tuo codice.


Questa è una copia della risposta accettata l'un l'altro. Perché?
Stephen Rauch,

innerHtml e html () hanno funzionato diversamente sul mio progetto. innerHtml non ha fatto nulla in uno scenario. Quindi l'ho aggiunto, nel caso sia lo stesso per chiunque altro.
Deepu Sahni,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.