Bagaimana cara menambahkan data ke div menggunakan JavaScript?

404

Saya menggunakan AJAX untuk menambahkan data ke elemen div, di mana saya mengisi div dari JavaScript, bagaimana saya bisa menambahkan data baru ke div tanpa kehilangan data sebelumnya yang ditemukan di div?

Adham
sumber
7
$ (div). append (data);
Jimy
56
@jimy itu jquery, tidak perlu menggunakannya untuk hal sepele seperti itu
Naftali alias Neal
2
@Neal tentu, tapi dia menggunakan AJAX juga, jadi jQuery jelas merupakan ide yang bagus!
Alnitak
3
@Alnitak, tapi bagaimana Anda tahu OP menggunakan jQuery untuk apa saja?
Naftali alias Neal
26
@Alnitak, jQuery bukan satu - satunya solusi ajax
Naftali aka Neal

Jawaban:

585

Coba ini:

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

div.innerHTML += 'Extra stuff';
Naftali alias Neal
sumber
31
Bahaya, Will Robinson! Ini menambahkan HTML , bukan teks. Jika Barang Tambahan Anda disediakan oleh pengguna, Anda baru saja memperkenalkan kerentanan keamanan. Lebih baik menggunakan jawaban @ Chandu di bawah ini.
David Diberikan
8
Ya, ini merupakan kerentanan XSS . Anda jauh lebih baik membuat simpul teks dengan konten sebagai gantinya, seperti yang dijelaskan dalam jawaban di bawah ini.
David Diberikan
1
Ini juga tidak akan berfungsi jika divmengandung elemen dengan pendengar acara atau input dengan teks yang dimasukkan pengguna. Saya merekomendasikan jawabannya oleh Chandu .
user4642212
2
Ya, saya pasti tidak merekomendasikan ini karena ini akan menghancurkan keadaan kotak centang, pendengar acara.
Kurkula
339

Menggunakan appendChild:

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

Menggunakan innerHTML:
Pendekatan ini akan menghapus semua pendengar ke elemen yang ada seperti yang disebutkan oleh @BiAiB. Jadi gunakan hati-hati jika Anda berencana untuk menggunakan versi ini.

var theDiv = document.getElementById("<ID_OF_THE_DIV>");
theDiv.innerHTML += "<YOUR_CONTENT>"; 
Chandu
sumber
Saya menggunakan metode ini dengan elemen "contenteditable" saya dengan angularjs binding, dan semuanya berfungsi dengan benar!
Kesalahan
1
Seharusnya memang jawaban yang diterima. Bukan hanya cara yang indah, tetapi innerHTML akan membangun kembali DOM, dan itu bukan solusi yang baik. Gunakan appendChild ().
Jan Sverre
4
Ini lebih baik, tetapi createTextNodetidak akan berfungsi jika Anda memuat HTML. Jika Anda ingin menambahkan item daftar, misalnya, ini tidak akan berhasil. Itu sangat membatasi.
Jake
bagaimana jika kita ingin mengubah teks dari simpul teks yang ditambahkan pada peristiwa berikutnya?
Rahul Mishra
120

Waspadalah terhadap innerHTML, Anda kehilangan sesuatu saat menggunakannya:

theDiv.innerHTML += 'content',     

Setara dengan:

theDiv.innerHTML = theDiv.innerHTML + 'content'

Yang akan menghancurkan semua node di dalam Anda divdan membuat yang baru. Semua referensi dan pendengar elemen di dalamnya akan hilang .

Jika Anda perlu menyimpannya (ketika Anda telah melampirkan handler klik, misalnya), Anda harus menambahkan konten baru dengan fungsi DOM (appendChild, masukkanSetelah, masukkanSebelum):

var newNode = document.createElement('div');      
newNode.innerHTML = data;
theDiv.appendChild( newNode )
BiAiB
sumber
2
ya tapi ini akan menyebabkan ada div tambahan di dalam div induk yang tidak diperlukan dan mungkin mengacaukan beberapa gaya css
Naftali alias Neal
@Neal Ini hanyalah contoh cara untuk menggunakan appendChild. intinya bukan di sini.
BiAiB
Cara yang benar untuk melakukannya appendChilddilakukan oleh @Cybernate
Naftali alias Neal
3
@Neal no bukan. Itu tidak benar atau salah. Itu hanya tergantung pada apa yang OP perlu tambahkan: teks, kode html atau yang lainnya.
BiAiB
1
@Neal Ini adalah cara yang sangat baik untuk menambahkan data, dan lebih fleksibel daripada document.createTextNode().
Alnitak
57

Jika Anda ingin melakukannya dengan cepat dan tidak ingin kehilangan referensi dan pendengar gunakan: .insertAdjacentHTML () ;

"Itu tidak memecah elemen yang sedang digunakan dan karenanya tidak merusak elemen yang ada di dalam elemen. Ini, dan menghindari langkah tambahan serialisasi membuatnya lebih cepat daripada manipulasi innerHTML langsung."

Didukung di semua browser arus utama (IE6 +, FF8 +, Lainnya, dan Seluler): http://caniuse.com/#feat=insertadjacenthtml

Contoh dari 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
sumber
Adakah pertimbangan, kendala, dll. saat menggunakan metode ini?
som
1
Kompatibilitas yang luar biasa: solusi yang lebih baik!
Arthur Araújo
2
Ada juga insertAdjacentElement()dan insertAdjacentText().
Nyg
Metode ini adalah solusi terbaik!
Sergey NN
18

Jika Anda menggunakan jQuery, Anda dapat menggunakan $('#mydiv').append('html content')dan itu akan menjaga konten yang ada.

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

Thomas Brasington
sumber
8

Bahkan ini akan berhasil:

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

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

Solusi IE9 + (Vista +), tanpa membuat simpul teks baru:

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

Namun, ini tidak cukup membantu saya karena saya membutuhkan baris baru setelah setiap pesan, jadi DIV saya berubah menjadi UL bergaya dengan kode ini:

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

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

Perbedaan dari innerHTML

innerHTML mengembalikan HTML seperti namanya. Cukup sering, untuk mengambil atau menulis teks dalam suatu elemen, orang menggunakan innerHTML. textContent harus digunakan sebagai gantinya. Karena teks tidak diuraikan sebagai HTML, itu cenderung memiliki kinerja yang lebih baik. Selain itu, ini menghindari vektor serangan XSS.

LGT
sumber
3

Anda bisa menggunakan jQuery. yang membuatnya sangat sederhana.

cukup unduh file jQuery, tambahkan jQuery ke HTML
Anda atau Anda dapat menggunakan tautan daring:

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

dan coba ini:

 $("#divID").append(data);
Wisnu Mishra
sumber
1

Metode berikut ini kurang umum daripada yang lain namun itu bagus ketika Anda yakin bahwa simpul anak terakhir Anda dari div sudah menjadi simpul teks. Dengan cara ini Anda tidak akan membuat simpul teks baru menggunakan 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
sumber
0

Mengapa tidak menggunakan setAttribute saja?

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

Maka Anda bisa mendapatkan data ini dengan:

thisDiv.attrName;
thatOneGuy
sumber
Karena itu tidak ada hubungannya dengan pertanyaan?
FaZe Unempl0yedd
-1

skrip java

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

jquery

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

Gunakan .html()tanpa argumen apa pun untuk melihat bahwa Anda telah memasukkan. Anda dapat menggunakan konsol browser untuk dengan cepat menguji fungsi-fungsi ini sebelum menggunakannya dalam kode Anda.

Deepu Sahni
sumber
Ini adalah salinan dari jawaban yang diterima yang lain. Mengapa?
Stephen Rauch
innerHtml dan html () bekerja secara berbeda pada proyek saya. innerHtml tidak melakukan apa pun dalam satu skenario. Jadi menambahkannya, kalau-kalau itu sama untuk orang lain.
Deepu Sahni