ฉันจะแทนที่ข้อความภายในองค์ประกอบ div ได้อย่างไร


166

ฉันต้องตั้งค่าข้อความภายในองค์ประกอบ DIV แบบไดนามิก อะไรคือวิธีที่ปลอดภัยและดีที่สุดสำหรับเบราว์เซอร์ ฉันมีต้นแบบและสคริปต์ที่ใช้ได้

<div id="panel">
  <div id="field_name">TEXT GOES HERE</div>
</div>

ฟังก์ชันจะมีลักษณะดังนี้:

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById('field_name');
  //Make replacement here
}

คำตอบที่ยอมรับทำในสิ่งที่คุณต้องการหรือไม่เมื่อข้อความที่กำหนดเช่น: - <span style = "font-size: 36pt"> นี่มันใหญ่ </span> หากพฤติกรรมนี้เป็นที่พึงปรารถนาคุณสามารถตั้งคำถามให้ตรงกันได้หรือไม่
AnthonyWJones

สามารถใช้สิ่งนี้ในการโจมตีการฉีด XSS หรือไม่
James Westgate

คำตอบ:


49

ฉันจะใช้updateวิธีของ Prototype ที่สนับสนุนข้อความธรรมดาตัวอย่าง HTML หรือวัตถุ JavaScript ใด ๆ ที่กำหนดtoStringวิธีการ

$("field_name").update("New text");

26
@ Aeyoun OP หมายถึงพวกเขาใช้ Prototype อยู่แล้วดังนั้นหากเป็นกรณีนี้มันสมเหตุสมผลที่จะใช้ประโยชน์จากมัน
John Topley

6
ทำไมถึงใช้งานได้กับ$("field_name").text("new text");
Drako

@Drako คุณใช้ PrototypeJS หรือไม่
John Topley

10
@Drako คำถามเดิมและคำตอบของฉันเมื่อเจ็ดปีก่อนมีไว้สำหรับ PrototypeJS ไม่ใช่ jQuery
John Topley

255

คุณสามารถใช้:

fieldNameElement.innerHTML = "My new text!";

2
ไม่ควรใช้เครื่องหมายคำพูดเดี่ยวสำหรับข้อความ 'คงที่'
Milan Babuškov

5
ใน PHP ใช่ ใน JavaScript ฉันไม่เชื่อว่ามันสำคัญ
ceejayoz

46
ใน Javascript เครื่องหมายคำพูดเดี่ยวและคู่สามารถใช้แทนกันได้
17 ของ 26

18
คำแนะนำที่ไม่ดีเนื่องจากข้อความอาจมีเนื้อหาที่เหมือนมาร์กอัป HTML โดยไม่ได้ตั้งใจ
Trident D'Gao

10
element.innerHTML = "<script>doSomethingMalicious()</script>";จะไม่เป็นความคิดที่ดี element.innerHTML = "& neither will this";
Joseph Nields

175

อัปเดตสำหรับทุกคนที่อ่านข้อความนี้ในปี 2013 และใหม่กว่า:

คำตอบนี้มี SEO จำนวนมาก แต่คำตอบทั้งหมดล้าสมัยและขึ้นอยู่กับห้องสมุดที่จะทำสิ่งต่าง ๆ ที่เบราว์เซอร์ปัจจุบันทั้งหมดทำอยู่นอกกรอบ

ในการแทนที่ข้อความภายในองค์ประกอบ div ให้ใช้ Node.textContent ซึ่งมีให้ในเบราว์เซอร์ปัจจุบันทั้งหมด

fieldNameElement.textContent = "New text";

10
@Legolas ดังนั้นเขียน 'เบราว์เซอร์ปัจจุบัน' เมื่อสองปีก่อน
mikemaccana

2
ขอบคุณ! ฉันลองคำตอบอื่น ๆ โดยสงสัยว่าทำไม 'innerHTML' ไม่ทำงาน
GreySage

2
คุณอาจพิจารณาอย่างละเอียดว่าทำไมtextContentวิธีการที่เหนือกว่าinnerHTMLคือ: เร็วกว่าปลอดภัยกว่าและเหมาะสมกว่าเมื่อไม่ได้พยายามแทรกมาร์กอัป HTML
CertainPerformance

75

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById("field_name");
  while(fieldNameElement.childNodes.length >= 1) {
    fieldNameElement.removeChild(fieldNameElement.firstChild);
  }
  fieldNameElement.appendChild(fieldNameElement.ownerDocument.createTextNode(fieldName));
}

ข้อดีของการทำแบบนี้:

  1. มันใช้ DOM เท่านั้นดังนั้นเทคนิคนี้สามารถพกพาไปยังภาษาอื่น ๆ ได้และไม่ต้องพึ่งพา innerHTML ที่ไม่ได้มาตรฐาน
  2. fieldName อาจมี HTML ซึ่งอาจเป็นการพยายามโจมตี XSS หากเรารู้ว่ามันเป็นเพียงข้อความเราควรสร้างโหนดข้อความแทนการให้เบราว์เซอร์แยกวิเคราะห์สำหรับ HTML

ถ้าฉันจะใช้ไลบรารี javascript ฉันจะใช้ jQuery และทำสิ่งนี้:


  $("div#field_name").text(fieldName);

โปรดทราบว่าความคิดเห็น @AnthonyWJonesนั้นถูกต้อง: "field_name" ไม่ใช่รหัสอธิบายหรือชื่อตัวแปรโดยเฉพาะ


ภาษาอื่นที่คุณสามารถถ่ายทอดเทคนิคนี้ให้กับ
John Topley

ภาษาใดก็ตามที่มีการใช้งาน DOM รองรับสิ่งนี้ (และภาษาส่วนใหญ่มีการใช้งาน DOM)
เควนติน

นี่คือคำตอบที่ดีดีกว่าของฉันและเป็นคำตอบที่ถูกต้อง คุณอาจพิจารณาจัดเก็บตัวอย่าง 'fieldname' ไม่ใช่ชื่อที่ดีสำหรับพารามิเตอร์ของฟังก์ชัน ในความเป็นจริงมันอาจเป็นการดีที่สุดที่จะใช้สองอันสำหรับรหัสองค์ประกอบและอีกอันสำหรับเนื้อหานั่นคือ elemID, เนื้อหา
AnthonyWJones

ฉันยืม fieldName และ ID จากคำถามนั้น
Daniel Papasian

คำถามอาจใช้ field_name เพื่อสร้างตัวอย่างทั่วไป ผู้ถามระบุว่า Prototype พร้อมใช้งาน แต่ไม่ใช่ jQuery
John Topley

17
$('field_name').innerHTML = 'Your text.';

หนึ่งในคุณสมบัติที่ดีของต้นแบบคือว่าจะเป็นสิ่งเดียวกับ$('field_name') document.getElementById('field_name')ใช้มัน! :-)

คำตอบของ John Topley ที่ใช้updateฟังก์ชั่นของ Prototype เป็นอีกทางเลือกที่ดี


4
ไม่เหมือน JavaScript ใช่ไหม
Milan Babuškov

1
อย่าใช้ innerHTML มันไม่ได้เป็นข้อเสนอแนะของ w3c และมีพฤติกรรมที่ไม่สอดคล้องกัน มันถือว่าเป็นสไตล์ที่ไม่ดี
Tom

ทอมควรใช้อะไรแทน (ถ้าคุณไม่ได้ใช้ Prototype)
Milan Babuškov

1
มิลานวิธีที่ได้รับการยอมรับมากขึ้นคือการวนซ้ำผ่านโหนดย่อยเรียก callNode (จริง) บนแต่ละโหนดจากนั้นผนวกโหนดใหม่ที่สร้างขึ้นโดยใช้ document.createElement () หรือ document.createTextNode () หากคุณต้องการทำเช่นนั้นฉันขอแนะนำให้เขียนฟังก์ชั่นเพื่อหลีกเลี่ยงการพิมพ์จำนวนมาก
Joel Anair

3
@RaduSimionescu ไม่มันไม่ใช่ คำถามและคำตอบนี้เกี่ยวกับ Prototype.js ไม่ใช่ jQuery ใน Prototype $ค้นหารายการตาม ID ไม่ใช่ตัวเลือกตาม jQuery api.prototypejs.org/dom/dollar
ceejayoz

15

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

ใน IE: -

document.getElementById("field_name").innerText = newText;

ใน FF: -

document.getElementById("field_name").textContent = newText;

(ที่จริงแล้ว FF มีดังต่อไปนี้ตามรหัส)

HTMLElement.prototype.__defineGetter__("innerText", function () { return this.textContent; })

HTMLElement.prototype.__defineSetter__("innerText", function (inputText) { this.textContent = inputText; })

ตอนนี้ฉันสามารถใช้ InnerText หากคุณต้องการการสนับสนุนเบราว์เซอร์ที่กว้างที่สุดเท่าที่จะเป็นไปได้นี่ไม่ใช่การแก้ปัญหาที่สมบูรณ์ แต่ไม่ได้ใช้ InnerHTML ในการดิบ


7

หากคุณต้องการให้เราดำเนินการต่อจากจุดที่คุณค้างไว้คุณสามารถทำได้:

if (fieldNameElement)
    fieldNameElement.innerHTML = 'some HTML';

5

nodeValue ยังเป็นคุณสมบัติ DOM มาตรฐานที่คุณสามารถใช้:

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);
  if(fieldNameElement.firstChild)
    fieldNameElement.firstChild.nodeValue = "New Text";
}


1

หากคุณอยากเริ่มใช้ JavaScript เป็นจำนวนมากบนไซต์ของคุณ jQuery ทำให้การเล่นกับ DOM ง่ายมาก

http://docs.jquery.com/Manipulation

ทำให้ง่ายเหมือน: $ ("# field-name"). text ("ข้อความใหม่บางคำ");


ต้นแบบมีฟังก์ชั่นยูทิลิตี้ที่คล้ายกัน
ceejayoz


0
function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);

  fieldNameElement.removeChild(fieldNameElement.firstChild);
  var newText = document.createTextNode("New Text");
  fieldNameElement.appendChild(newText);
}

ดีกว่าที่จะเปลี่ยนโหนดแล้วเพื่อลบมันและเพิ่มใหม่เป็นสองการดำเนินงานแยกต่างหาก
เควนติน

0

นี่คือวิธีjQueryง่ายๆ :

var el = $('#yourid .yourclass');

el.html(el.html().replace(/Old Text/ig, "New Text"));

ดูเหมือนว่าเป็นความคิดที่ไม่ดีถ้าองค์ประกอบของคุณมีโหนดย่อยที่มีข้อความเดียวกันหรือข้อความของคุณตรงกับชื่อแท็กองค์ประกอบ ทำไมไม่ใช้. text?
James Westgate

ฉันเห็นด้วยอย่างยิ่งกับ James Westgate ไม่ควรทำเช่นนั้น
TGarrett

0

ใน HTML ให้ใส่สิ่งนี้

<div id="field_name">TEXT GOES HERE</div>

ใน Javascript ให้ใส่สิ่งนี้

var fieldNameElement = document.getElementById('field_name');
        if (fieldNameElement)
        {fieldNameElement.innerHTML = 'some HTML';}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.