Làm cách nào để nối dữ liệu vào div bằng JavaScript?


404

Tôi đang sử dụng AJAX để nối thêm dữ liệu vào phần tử div, nơi tôi điền div từ JavaScript, làm cách nào tôi có thể nối thêm dữ liệu mới vào div mà không mất dữ liệu trước đó trong div?


7
$ (div) .append (dữ liệu);
jimy

56
@jimy thats jquery, không cần sử dụng nó cho một việc tầm thường như vậy
Naftali aka Neal

2
@ Chắc chắn, nhưng anh ấy cũng đang sử dụng AJAX, vì vậy jQuery chắc chắn là một ý tưởng hay!
Alnitak

3
@Alnitak, nhưng làm sao bạn biết OP đang sử dụng jQuery cho bất cứ điều gì?
Naftali aka Neal

26
@Alnitak, jQuery không phải là giải pháp ajax duy nhất
Naftali aka Neal

Câu trả lời:


585

Thử cái này:

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

div.innerHTML += 'Extra stuff';

31
Nguy hiểm, Will Robinson! Điều này thêm HTML , không phải văn bản. Nếu Extra Stuff của bạn được cung cấp bởi người dùng, bạn vừa giới thiệu một lỗ hổng bảo mật. Tốt hơn để sử dụng câu trả lời của @ Chandu dưới đây.
David đưa ra

8
Vâng, đó là một lỗ hổng XSS . Thay vào đó, tốt hơn hết là bạn nên tạo một nút văn bản với nội dung, như được mô tả trong câu trả lời dưới đây.
David đưa ra

1
Điều này cũng sẽ không hoạt động trong trường hợp divcó chứa các yếu tố với trình nghe sự kiện hoặc đầu vào với văn bản do người dùng nhập. Tôi đề nghị câu trả lời của Chandu .
dùng4642212


2
Có, tôi chắc chắn không khuyến nghị điều này vì điều này sẽ phá hủy trạng thái của bất kỳ hộp kiểm, người nghe sự kiện nào.
Kurkula

338

Sử dụng appendChild:

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

Sử dụng InternalHTML:
Cách tiếp cận này sẽ loại bỏ tất cả người nghe đối với các yếu tố hiện có như được đề cập bởi @BiAiB. Vì vậy, hãy thận trọng nếu bạn đang có kế hoạch sử dụng phiên bản này.

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

Tôi sử dụng phương pháp này với phần tử "có thể nội dung" với ràng buộc angularjs và mọi thứ đều hoạt động chính xác!
sai

1
Nên là câu trả lời được chấp nhận thực sự. Không chỉ là một cách hay, mà InternalHTML sẽ xây dựng lại DOM và đó không phải là một giải pháp tốt. Sử dụng appendChild ().
Jan Sverre

4
Điều này tốt hơn, nhưng createTextNodesẽ không hoạt động nếu bạn đang tải HTML. Nếu bạn muốn thêm các mục danh sách, ví dụ, điều này sẽ không hoạt động. Đó là khá hạn chế.
Jake

Điều gì xảy ra nếu chúng ta muốn thay đổi văn bản của cùng một nút văn bản được nối thêm trong sự kiện tiếp theo?
Rahul Mishra

120

Coi chừng innerHTML, bạn sẽ mất thứ gì đó khi sử dụng nó:

theDiv.innerHTML += 'content',     

Tương đương với:

theDiv.innerHTML = theDiv.innerHTML + 'content'

Điều này sẽ phá hủy tất cả các nút bên trong của bạn divvà tạo lại những cái mới.Tất cả các tài liệu tham khảo và người nghe các yếu tố bên trong nó sẽ bị mất .

Nếu bạn cần giữ chúng (ví dụ: khi bạn đã đính kèm trình xử lý nhấp chuột), bạn phải nối thêm nội dung mới bằng các hàm DOM (appendChild, insertAfter, insertB Before):

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

2
đúng nhưng điều này sẽ khiến có thêm một div bên trong div cha không cần thiết và có thể làm rối tung một số kiểu css
Naftali aka Neal

@Neal đây chỉ là một cách ví dụ để sử dụng appendChild. điểm không ở đây.
BiAiB

Cách chính xác để appendChildthực hiện được thực hiện bởi @Cybernate
Naftali aka Neal

3
@ Không có nó không phải. Nó không đúng hoặc không chính xác. Nó chỉ phụ thuộc vào những gì OP cần thêm vào: văn bản, mã html hoặc thứ gì khác.
BiAiB

1
@Neal đây là một cách hoàn toàn tốt để nối thêm dữ liệu và linh hoạt hơn document.createTextNode().
Alnitak

57

Nếu bạn muốn làm nhanh và không muốn mất tài liệu tham khảo và người nghe hãy sử dụng: .insertAdjighborHTML () ;

"Nó không lặp lại phần tử mà nó đang được sử dụng và do đó nó không làm hỏng các phần tử hiện có bên trong phần tử. Điều này và tránh bước thêm của tuần tự hóa làm cho nó nhanh hơn nhiều so với thao tác bên trong trực tiếp."

Được hỗ trợ trên tất cả các trình duyệt chính (IE6 +, FF8 +, Tất cả các trình duyệt khác và Di động): http://caniuse.com/#feat=insertadjighborhtml

Ví dụ từ https://developer.mozilla.org/en-US/docs/Web/API/Euity/insertAdjighborHTML

// <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>

Có bất kỳ cân nhắc, ràng buộc, vv khi sử dụng phương pháp này?
som

1
Khả năng tương thích tuyệt vời: giải pháp tốt hơn!
Arthur Araújo

2
Cũng có insertAdjacentElement()insertAdjacentText().
nyg


Phương pháp này là giải pháp tốt nhất!
Serge NN


8

Ngay cả điều này sẽ làm việc:

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

div.innerHTML += 'Text to append';

6

Giải pháp IE9 + (Vista +) mà không tạo các nút văn bản mới:

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

Tuy nhiên, điều này không thực sự giúp tôi vì tôi cần một dòng mới sau mỗi tin nhắn, vì vậy DIV của tôi đã biến thành một UL theo kiểu với mã này:

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

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

Sự khác biệt so với InternalHTML

InternalHTML trả về HTML như tên của nó chỉ ra. Rất thường xuyên, để truy xuất hoặc viết văn bản trong một phần tử, mọi người sử dụng InternalHTML. textContent nên được sử dụng thay thế. Vì văn bản không được phân tích cú pháp dưới dạng HTML, nên nó có thể có hiệu suất tốt hơn. Hơn nữa, điều này tránh một vectơ tấn công XSS.


3

bạn có thể sử dụng jQuery. mà làm cho nó rất đơn giản.

chỉ cần tải xuống tệp jQuery thêm jQuery vào HTML của bạn
hoặc bạn có thể sử dụng liên kết trực tuyến:

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

và thử điều này:

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

1

Phương thức sau ít tổng quát hơn các phương thức khác tuy nhiên thật tuyệt vời khi bạn chắc chắn rằng nút con cuối cùng của div đã là nút văn bản. Theo cách này, bạn sẽ không tạo nút văn bản mới bằng 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

Tại sao không sử dụng setAttribution?

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

Sau đó, bạn có thể lấy dữ liệu này bằng cách:

thisDiv.attrName;

Bởi vì điều đó không liên quan gì đến câu hỏi?
FaZe Unempl0yedd

-1

tập lệnh java

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

jquery

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

Sử dụng .html()mà không có bất kỳ đối số để thấy rằng bạn đã nhập. Bạn có thể sử dụng bảng điều khiển trình duyệt để nhanh chóng kiểm tra các chức năng này trước khi sử dụng chúng trong mã của bạn.


Đây là một bản sao của câu trả lời được chấp nhận cho nhau. Tại sao?
Stephen Rauch

InternalHtml và html () hoạt động khác nhau trong dự án của tôi. InternalHtml không làm gì trong một kịch bản. Vì vậy, thêm nó, trong trường hợp nó giống nhau cho bất cứ ai khác.
Deepu Sahni
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.