ฉันจะเปลี่ยนข้อความขององค์ประกอบ span ใน JavaScript ได้อย่างไร


388

ถ้าฉันมีช่วงพูด:

<span id="myspan"> hereismytext </span>

ฉันจะใช้ JavaScript เพื่อเปลี่ยน "hereismytext" เป็น "newtext" ได้อย่างไร

คำตอบ:


636

สำหรับเบราว์เซอร์สมัยใหม่คุณควรใช้:

document.getElementById("myspan").textContent="newtext";

แม้ว่าเบราว์เซอร์รุ่นเก่าอาจไม่รู้จักtextContentแต่ก็ไม่แนะนำให้ใช้innerHTMLเนื่องจากเป็นช่องโหว่ของ XSS เมื่อข้อความใหม่คือการป้อนข้อมูลของผู้ใช้ (ดูคำตอบอื่น ๆ ด้านล่างสำหรับการสนทนาที่ละเอียดยิ่งขึ้น):

//POSSIBLY INSECURE IF NEWTEXT BECOMES A VARIABLE!!
document.getElementById("myspan").innerHTML="newtext";

2
@bouncingHippo document.getElementById ("myspan") setAttribute ("สไตล์", "cssvalues");
Gregoire

3
ควรจะมีวิธีการรวมสองคำตอบเป็นหนึ่ง มันเป็นคำตอบที่แน่นอนเหมือนกัน
Hermann Ingjaldsson

7
สิ่งนี้ไม่ได้ตั้งค่าข้อความมันตั้งค่าHTMLซึ่งแตกต่างกันโดยพื้นฐาน
แบรด

22
@gregoire - ตามที่คนอื่น ๆ ได้ชี้ให้เห็นแล้วคำตอบของคุณมีความเสี่ยงต่อ XSS คำถามนี้ได้รับการดูประมาณ 80k ครั้งแล้วซึ่งหมายความว่าผู้คนจำนวนมากอาจใช้วิธีนี้และอาจแนะนำ xss รั่วไหลโดยไม่จำเป็น คุณสามารถพิจารณาปรับปรุงคำตอบของคุณเพื่อใช้textContentแทนได้หรือไม่เช่นนั้นผู้คนใหม่ ๆ จะได้รับการส่งเสริมให้ใช้วิธีการที่เหมาะสมและปลอดภัยหรือไม่
Tiddo

2
@Tiddo textContent ไม่รองรับ IE8 และต่ำกว่าและฉันหวังว่าคุณจะไม่เคยใช้อินพุตที่ไม่ได้รับการฆ่าเชื้อโดยตรงในสคริปต์ของคุณ
Gregoire

75

การใช้innerHTMLจะไม่แนะนำให้ใช้ คุณควรสร้าง textNode แทน ด้วยวิธีนี้คุณจะ "ผูกมัด" ข้อความของคุณและอย่างน้อยในกรณีนี้คุณอาจเสี่ยงต่อการถูกโจมตีด้วย XSS

document.getElementById("myspan").innerHTML = "sometext"; //INSECURE!!

ทางที่ถูก:

span = document.getElementById("myspan");
txt = document.createTextNode("your cool text");
span.appendChild(txt);

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับช่องโหว่นี้: Cross Site Scripting (XSS) - OWASP

แก้ไขเมื่อวันที่ 4 พฤศจิกายน 2017:

แก้ไขโค้ดบรรทัดที่สามตามคำแนะนำ@mumush : "use appendChild (); แทน"
Btw ตาม@Jimbo Jonnyฉันคิดว่าทุกสิ่งควรได้รับการปฏิบัติเหมือนเป็นข้อมูลผู้ใช้โดยใช้หลักการความปลอดภัยตามเลเยอร์ ด้วยวิธีนี้คุณจะไม่พบกับความประหลาดใจใด ๆ


6
ในขณะที่คุณถูกต้องเกี่ยวกับการinnerHTMLใช้ความระมัดระวังโปรดทราบว่าโซลูชันของคุณใช้innerTextซึ่งไม่รองรับใน Firefox quirksmode.org/dom/htmlนอกจากนี้ยังใช้textContentซึ่งไม่รองรับใน IE8 คุณสามารถจัดโครงสร้างรหัสเพื่อแก้ไขปัญหาเหล่านี้
Trott

4
ใช้span.appendChild(txt);แทน!
mumush

34
คำถามไม่ได้เกี่ยวกับการป้อนข้อมูลของผู้ใช้ดังนั้นคำสั่งแบบครอบคลุมที่innerHTMLไม่แนะนำนั้นไร้สาระ ไม่ต้องพูดถึงมันยังคงดีเมื่อถูกทำให้สะอาด แนวคิดที่ว่าควรทำให้ผู้ใช้มีความสุขในการป้อนข้อมูลจึงไม่เกี่ยวข้องกับคำถามนี้ ที่ส่วนใหญ่ก็บุญโน้ตเล็ก ๆ ในตอนท้ายว่า"ครับถ้าเป็นของผู้ใช้ป้อนให้แน่ใจว่าจะ sanitize แรกหรือการใช้วิธีการ X ที่ไม่จำเป็นต้อง"
Jimbo Jonny

นอกจากนี้การสร้างองค์ประกอบจะเร็วกว่าการใช้ InnerHTML
Samuel Rondeau-Millaire

4
การใช้ appendChild ไม่ได้เปลี่ยนข้อความ แต่เพิ่มลงในข้อความเท่านั้น ใช้รหัสของคุณที่นี่ช่วงจากคำถามเดิมจะจบลงด้วยการอ่าน "hereismytextyour text cool" บางทีอาจจะspan.innerHTML = "";ต่อท้ายเด็ก?
ShaneSauce


24

แก้ไข:นี่ถูกเขียนขึ้นในปี 2014 คุณอาจไม่สนใจเกี่ยวกับ IE8 อีกต่อไปและสามารถลืมinnerTextได้ เพียงแค่ใช้textContentและทำได้ด้วยมันไชโย

หากคุณเป็นผู้จัดหาข้อความและไม่มีส่วนใดส่วนหนึ่งของข้อความที่จัดทำโดยผู้ใช้ (หรือแหล่งข้อมูลอื่นที่คุณไม่ได้ควบคุม) การตั้งค่าinnerHTMLอาจเป็นที่ยอมรับ:

// * Fine for hardcoded text strings like this one or strings you otherwise 
//   control.
// * Not OK for user-supplied input or strings you don't control unless
//   you know what you are doing and have sanitized the string first.
document.getElementById('myspan').innerHTML = 'newtext';

อย่างไรก็ตามตามที่คนอื่น ๆ ทราบหากคุณไม่ได้เป็นแหล่งข้อมูลสำหรับส่วนใดส่วนหนึ่งของสตริงข้อความการใช้innerHTMLอาจทำให้คุณถูกโจมตีจากการฉีดเนื้อหาเช่น XSS หากคุณไม่ระมัดระวังในการทำให้ข้อความถูกต้องก่อน

หากคุณใช้การป้อนข้อมูลจากผู้ใช้นี่เป็นวิธีหนึ่งในการทำอย่างปลอดภัยในขณะที่ยังคงความเข้ากันได้ของเบราว์เซอร์ข้าม:

var span = document.getElementById('myspan');
span.innerText = span.textContent = 'newtext';

Firefox ไม่รองรับinnerTextและ IE8 ไม่รองรับtextContentดังนั้นคุณต้องใช้ทั้งคู่หากคุณต้องการรักษาความเข้ากันได้ของเบราว์เซอร์

และหากคุณต้องการหลีกเลี่ยงการ reflows (เกิดจากinnerText) เป็นไปได้:

var span = document.getElementById('myspan');
if ('textContent' in span) {
    span.textContent = 'newtext';
} else {
    span.innerText = 'newtext';
}

18

ฉันใช้Jqueryและไม่ได้ช่วยอะไรฉันไม่ทราบว่าทำไม แต่ใช้งานได้:

 $("#span_id").text("new_value");

7

นี่คือวิธีอื่น:

var myspan = document.getElementById('myspan');

if (myspan.innerText) {
    myspan.innerText = "newtext";
}
else
if (myspan.textContent) {
        myspan.textContent = "newtext";   
}

คุณสมบัติ InnerText จะถูกตรวจพบโดย Safari, Google Chrome และ MSIE สำหรับ Firefox วิธีมาตรฐานในการทำสิ่งต่าง ๆ คือการใช้ textContent แต่เนื่องจากเวอร์ชัน 45 มันก็มีคุณสมบัติด้านในเหมือนกัน โซลูชันนี้ทดสอบเพื่อดูว่าเบราว์เซอร์รองรับคุณสมบัติเหล่านี้หรือไม่และถ้าเป็นเช่นนั้นจะกำหนด "newtext"

การสาธิตสด: ที่นี่


1
Firefox ดำเนินการสนับสนุน innerText ในการเปิดตัว 45
user3351605

4

นอกเหนือจากคำตอบของจาวาสคริปต์บริสุทธิ์ข้างต้นคุณสามารถใช้วิธีการข้อความ jQuery ดังต่อไปนี้:

$('#myspan').text('newtext');

หากคุณต้องการขยายคำตอบเพื่อรับ / เปลี่ยนเนื้อหาhtmlขององค์ประกอบแบบขยายหรือแบบ div คุณสามารถทำได้ดังนี้:

$('#mydiv').html('<strong>new text</strong>');

อ้างอิง:

.text (): http://api.jquery.com/text/

.html (): http://api.jquery.com/html/


1

นอกจากนี้คุณยังสามารถใช้วิธี querySelector () โดยสมมติว่า 'myspan' id นั้นไม่เหมือนใครเนื่องจากวิธีนี้จะคืนค่าองค์ประกอบแรกด้วยตัวเลือกที่ระบุ:

document.querySelector('#myspan').textContent = 'newtext';

developer.mozilla


0

เช่นเดียวกับในคำตอบอื่น ๆinnerHTMLและinnerTextไม่แนะนำให้ใช้ก็ใช้ดีกว่าtextContent คุณลักษณะนี้ได้รับการสนับสนุนอย่างดีคุณสามารถตรวจสอบได้ที่นี่: http://caniuse.com/#search=textContent



0

คุณทำได้

 document.querySelector ("[Span]"). textContent = "content_to_display"; 


ความแตกต่างกับคำตอบที่ฉันให้คืออะไร?
Addis

-1

สำหรับช่วงนี้

<span id="name">sdfsdf</span>

คุณสามารถไปเช่นนี้: -

$("name").firstChild.nodeValue = "Hello" + "World";
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.