จะผนวกข้อมูลเพื่อ div โดยใช้ JavaScript ได้อย่างไร


404

ฉันใช้ AJAX ต่อท้ายข้อมูลเพื่อ div องค์ประกอบที่ฉันกรอก div จาก JavaScript ฉันจะผนวกข้อมูลใหม่ไปยัง div ได้อย่างไรโดยไม่สูญเสียข้อมูลก่อนหน้านี้ที่พบใน div


7
$ (div) .append (ข้อมูล);
jimy

56
@ jimy thats jquery ไม่จำเป็นต้องใช้สิ่งนั้นเพื่อสิ่งเล็กน้อย
Naftali aka Neal

2
@ ไม่แน่ใจ แต่เขาใช้ AJAX ด้วย jQuery เป็นความคิดที่ดีแน่นอน!
Alnitak

3
@Alnitak แต่คุณจะรู้ได้อย่างไรว่า OP ใช้ jQuery เพื่ออะไร
Naftali aka Neal

26
@Alnitak, jQuery ไม่ได้เป็นโซลูชั่น
อา

คำตอบ:


585

ลองสิ่งนี้:

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

div.innerHTML += 'Extra stuff';

31
อันตราย Will Robinson! นี่เป็นการเพิ่มHTMLไม่ใช่ข้อความ หากผู้ใช้งาน Extra Stuff ของคุณได้รับการแนะนำช่องโหว่ด้านความปลอดภัย ดีกว่าที่จะใช้คำตอบของ @ Chandu ด้านล่าง
เดวิดให้

8
ใช่มันเป็นช่องโหว่ XSS คุณดีกว่าการสร้างโหนดข้อความด้วยเนื้อหาแทนดังอธิบายในคำตอบด้านล่าง
เดวิดให้

1
สิ่งนี้ไม่ทำงานในกรณีที่divมีองค์ประกอบที่มีตัวรับเหตุการณ์หรืออินพุตพร้อมข้อความที่ผู้ใช้ป้อน ผมขอแนะนำให้คำตอบโดย Chandu
user4642212


2
ใช่ฉันไม่แนะนำให้ทำเช่นนี้เพราะจะเป็นการทำลายช่องทำเครื่องหมายใด ๆ ผู้ฟังเหตุการณ์
Kurkula

338

ใช้ appendChild:

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

การใช้ innerHTML:
วิธีการนี้จะลบผู้ฟังทั้งหมดไปยังองค์ประกอบที่มีอยู่ตามที่ระบุโดย @BiAiB ดังนั้นควรใช้ความระมัดระวังหากคุณวางแผนที่จะใช้เวอร์ชันนี้

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

ฉันใช้วิธีนี้กับองค์ประกอบ "contenteditable" ของฉันที่มีผลผูกพัน angularjs และทุกอย่างทำงานอย่างถูกต้อง!
misite

1
ควรเป็นคำตอบที่ยอมรับได้แน่นอน ไม่เพียง แต่เป็นวิธีที่สวยงามเท่านั้น แต่ innerHTML จะสร้าง DOM ขึ้นใหม่และนั่นไม่ใช่วิธีที่ดี ใช้ appendChild ()
Jan Sverre

4
สิ่งนี้ดีกว่า แต่createTextNodeจะไม่ทำงานหากคุณโหลด HTML หากคุณต้องการเพิ่มรายการเช่นนี้จะไม่ทำงาน นั่นค่อนข้าง จำกัด
Jake

ถ้าเราต้องการเปลี่ยนข้อความของโหนดข้อความต่อท้ายเดียวกันในเหตุการณ์ถัดไป
Rahul Mishra

120

ระวังinnerHTMLคุณจะสูญเสียบางสิ่งเมื่อคุณใช้:

theDiv.innerHTML += 'content',     

เทียบเท่ากับ:

theDiv.innerHTML = theDiv.innerHTML + 'content'

ซึ่งจะทำลายโหนดทั้งหมดที่อยู่ภายในของคุณdivและสร้างใหม่ อ้างอิงและผู้ฟังทุกองค์ประกอบภายในมันจะหายไป

หากคุณต้องการเก็บไว้ (เมื่อคุณแนบ handler คลิก) คุณต้องผนวกเนื้อหาใหม่ด้วยฟังก์ชัน DOM (appendChild, insertAfter, insertBefore):

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

2
ใช่ แต่สิ่งนี้จะทำให้มีdiv พิเศษใน div parent ซึ่งไม่จำเป็นและอาจทำให้รูปแบบ CSS บางอย่างยุ่งเหยิง
Naftali aka Neal

@ ไม่จริงนี่เป็นเพียงตัวอย่างวิธีใช้ appendChild ประเด็นไม่ได้อยู่ที่นี่
BiAiB

วิธีที่ถูกต้องในการทำappendChildทำโดย @Cybernate
Naftali aka Neal

3
@ ไม่จริงมันไม่ใช่ มันไม่ถูกต้องหรือไม่ถูกต้อง ขึ้นอยู่กับสิ่งที่ OP ต้องการผนวก: text, html code หรืออย่างอื่น
BiAiB

1
@Neal document.createTextNode()นี้เป็นวิธีที่ดีได้อย่างสมบูรณ์แบบของการผนวกข้อมูลและมีมากขึ้นหลากหลายกว่า
Alnitak

57

หากคุณต้องการทำอย่างรวดเร็วและไม่ต้องการสูญเสียการอ้างอิงและผู้ฟังให้ใช้: .insertAdighborHTML () ;

"มันไม่ได้แยกองค์ประกอบที่มันถูกใช้ไปและทำให้มันไม่เสียหายองค์ประกอบที่มีอยู่ภายในองค์ประกอบนี้และการหลีกเลี่ยงขั้นตอนพิเศษของการทำให้เป็นอันดับทำให้มันเร็วกว่าการควบคุมภายใน HTML โดยตรง"

สนับสนุนบนเบราว์เซอร์ mainline ทั้งหมด (IE6 +, FF8 +, อื่น ๆ ทั้งหมดและมือถือ): http://caniuse.com/#feat=insertadjacenthtml

ตัวอย่างจากhttps://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdighborHTML

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

มีการพิจารณาข้อ จำกัด ฯลฯ เมื่อใช้วิธีนี้หรือไม่?
ส้ม

1
ความเข้ากันได้ดีเยี่ยม: ทางออกที่ดีกว่า!
Arthur Araújo

2
นอกจากนี้ยังมีและinsertAdjacentElement() insertAdjacentText()
nyg


วิธีนี้เป็นทางออกที่ดีที่สุด!
Sergey NN



6

โซลูชัน IE9 + (Vista +) โดยไม่ต้องสร้างโหนดข้อความใหม่:

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

อย่างไรก็ตามสิ่งนี้ไม่ได้ทำเคล็ดลับสำหรับฉันเนื่องจากฉันต้องการบรรทัดใหม่หลังจากแต่ละข้อความดังนั้น DIV ของฉันจึงเปลี่ยนเป็น UL สไตล์ที่มีรหัสนี้:

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

จากhttps://developer.mozilla.org/en-US/docs/Web/API/Node/textContent :

ความแตกต่างจาก innerHTML

innerHTML ส่งคืน HTML ตามที่ชื่อระบุ บ่อยครั้งในการดึงหรือเขียนข้อความภายในองค์ประกอบคนใช้ InnerHTML ควรใช้ textContent แทน เนื่องจากข้อความไม่ได้ถูกแยกวิเคราะห์เป็น HTML จึงน่าจะมีประสิทธิภาพดีกว่า นอกจากนี้ยังเป็นการหลีกเลี่ยงเวกเตอร์การโจมตี XSS


3

คุณสามารถใช้ jQuery ซึ่งทำให้มันง่ายมาก

เพียงดาวน์โหลดไฟล์ jQuery เพิ่ม jQuery ใน HTML ของคุณ
หรือคุณสามารถลิงค์ออนไลน์:

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

และลองสิ่งนี้:

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

1

วิธีการต่อไปนี้เป็นวิธีทั่วไปน้อยกว่าวิธีอื่น ๆ แต่มันยอดเยี่ยมเมื่อคุณแน่ใจว่าโหนดลูกสุดท้ายของ div นั้นเป็นโหนดข้อความอยู่แล้ว ด้วยวิธีนี้คุณจะไม่สร้างโหนดข้อความใหม่โดยใช้appendData AppendData MDN Reference

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

ทำไมไม่ใช้แค่ setAttribute?

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

จากนั้นคุณสามารถรับข้อมูลนี้ได้โดย:

thisDiv.attrName;

เพราะนั่นไม่เกี่ยวอะไรกับคำถาม?
FaZe Unempl0yedd

-1

จาวาสคริปต์

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

jQuery

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

ใช้.html()โดยไม่มีข้อโต้แย้งใด ๆ เพื่อดูว่าคุณได้ป้อน คุณสามารถใช้คอนโซลเบราว์เซอร์เพื่อทดสอบฟังก์ชั่นเหล่านี้อย่างรวดเร็วก่อนที่จะใช้ในโค้ดของคุณ


นี่คือสำเนาของคำตอบที่ยอมรับซึ่งกันและกัน ทำไม?
Stephen Rauch

innerHtml และ html () ทำงานต่างกันในโครงการของฉัน innerHtml ไม่ได้ทำอะไรเลยในหนึ่งสถานการณ์ เพิ่มดังนั้นในกรณีที่มันเหมือนกันสำหรับคนอื่น
Deepu Sahni
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.