Bagaimana cara mengganti teks di dalam elemen div?


166

Saya perlu mengatur teks dalam elemen DIV secara dinamis. Apa yang terbaik, pendekatan aman browser? Saya memiliki prototypej dan skrip tersedia.

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

Seperti apa fungsinya nanti:

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

Apakah jawaban yang diterima melakukan apa yang Anda inginkan ketika teks yang ditugaskan seperti adalah: - <span style = "font-size: 36pt"> Ini besar </span>. Jika perilaku ini diinginkan, dapatkah Anda mengulang kembali pertanyaan yang cocok?
AnthonyWJones

Mungkinkah ini digunakan dalam serangan injeksi XSS?
James Westgate

Jawaban:


49

Saya akan menggunakan updatemetode Prototipe yang mendukung teks biasa, cuplikan HTML, atau objek JavaScript apa pun yang menentukan toStringmetode.

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

26
@Aeyoun OP menyiratkan mereka sudah menggunakan Prototipe, jadi jika itu masalahnya masuk akal untuk mengambil keuntungan darinya.
John Topley

6
Mengapa hanya bekerja pada saya$("field_name").text("new text");
Drako

@Do Apakah Anda menggunakan PrototypeJS?
John Topley

10
@ Drako Pertanyaan asli dan jawaban saya dari tujuh tahun lalu adalah untuk PrototypeJS bukan jQuery.
John Topley

255

Anda cukup menggunakan:

fieldNameElement.innerHTML = "My new text!";

2
Tidakkah seharusnya kutipan tunggal digunakan untuk teks 'statis'?
Milan Babuškov

5
Di PHP, ya. Dalam JavaScript, saya tidak percaya itu penting.
ceejayoz

46
Dalam Javascript, kutipan tunggal dan ganda dapat dipertukarkan.
17 dari 26

18
saran yang buruk, karena teks dapat berisi konten seperti HTML secara tidak sengaja
Trident D'Gao

10
element.innerHTML = "<script>doSomethingMalicious()</script>";tidak akan menjadi ide yang bagus. element.innerHTML = "& neither will this";
Joseph Nields

175

Diperbarui untuk semua orang yang membaca ini di 2013 dan yang lebih baru:

Jawaban ini memiliki banyak SEO, tetapi semua jawaban sangat ketinggalan zaman dan bergantung pada perpustakaan untuk melakukan hal-hal yang semua browser saat ini lakukan di luar kotak.

Untuk mengganti teks di dalam elemen div, gunakan Node.textContent, yang disediakan di semua browser saat ini.

fieldNameElement.textContent = "New text";

10
@ Legolas Karena itu menulis 'browser saat ini' dua tahun lalu.
mikemaccana

2
Terima kasih! Saya mencoba jawaban lain, bertanya-tanya mengapa 'innerHTML' tidak berfungsi.
GreySage

2
Anda dapat mempertimbangkan untuk menjelaskan mengapa textContentmetode yang lebih baik innerHTML: lebih cepat, lebih aman, dan lebih tepat jika tidak sengaja mencoba menyisipkan markup HTML.
Kinerja Tertentu

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));
}

Keuntungan melakukannya dengan cara ini:

  1. Hanya menggunakan DOM, sehingga teknik ini portabel untuk bahasa lain, dan tidak bergantung pada innerHTML non-standar
  2. fieldName mungkin berisi HTML, yang bisa berupa serangan XSS yang dicoba. Jika kita tahu itu hanya teks, kita harus membuat simpul teks, alih-alih peramban menguraikannya untuk HTML

Jika saya akan menggunakan perpustakaan javascript, saya akan menggunakan jQuery, dan lakukan ini:


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

Perhatikan bahwa komentar @AnthonyWJones benar: "field_name" bukan id deskriptif atau nama variabel.


Bahasa lain mana yang bisa Anda gunakan untuk teknik ini?
John Topley

Bahasa apa pun dengan implementasi DOM mendukung hal ini (dan sebagian besar bahasa memiliki implementasi DOM).
Quentin

Ini adalah jawaban yang baik, lebih baik dari pada saya dan ini adalah jawaban yang benar. Anda dapat mempertimbangkan merapikan contoh. 'fieldname' bukan nama yang baik untuk parameter fungsi. Bahkan mungkin lebih baik mengambil dua satu untuk ID elemen dan satu lagi untuk konten, yaitu; elemID, konten
AnthonyWJones

Saya meminjam fieldName dan ID dari pertanyaan itu sendiri.
Daniel Papasian

Pertanyaannya mungkin menggunakan field_name untuk membuat contoh generik. Penanya juga menyebutkan bahwa Prototipe tersedia tetapi tidak jQuery.
John Topley

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

Salah satu fitur bagus dari Prototype adalah $('field_name')melakukan hal yang samadocument.getElementById('field_name') . Gunakan! :-)

Jawaban John Topley menggunakan updatefungsi Prototype adalah solusi bagus lainnya.


4
Itu tidak terlihat seperti JavaScript?
Milan Babuškov

1
Jangan gunakan innerHTML. Ini bukan rekomendasi w3c dan berperilaku tidak konsisten. Itu dianggap gaya yang buruk.
Tom

Tom, apa yang harus digunakan sebagai gantinya (jika Anda tidak menggunakan Prototipe)?
Milan Babuškov

1
Milan, cara yang lebih diterima adalah untuk mengulang melalui childNodes, panggil removeNode (true) pada masing-masing, kemudian tambahkan node baru yang dibuat menggunakan document.createElement () atau document.createTextNode (). Jika Anda perlu melakukan itu, saya akan merekomendasikan menulis fungsi untuk menghindari banyak mengetik.
Joel Anair

3
@RaduSimionescu Tidak, tidak. Pertanyaan dan jawaban ini tentang Prototype.js, bukan jQuery. Dalam Prototipe $mencari item dengan ID. Ini bukan berbasis pemilih seperti jQuery. api.prototypejs.org/dom/dollar
ceejayoz

15

Jawaban cepatnya adalah menggunakan innerHTML (atau metode pembaruan prototipe yang hampir sama). Masalah dengan innerHTML adalah Anda harus keluar dari konten yang ditugaskan. Bergantung pada target Anda, Anda perlu melakukannya dengan kode lain ATAU

di IE: -

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

dalam FF: -

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

(Sebenarnya FF memiliki kode berikut ini)

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

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

Sekarang saya bisa menggunakan innerText jika Anda membutuhkan dukungan browser seluas mungkin maka ini bukan solusi yang lengkap tetapi tidak menggunakan innerHTML di internet.


7

Jika Anda benar-benar ingin kami melanjutkan di mana Anda tinggalkan, Anda bisa melakukan:

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

5

nodeValue juga merupakan properti DOM standar yang dapat Anda gunakan:

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


1

Jika Anda cenderung mulai menggunakan banyak JavaScript di situs Anda, jQuery membuat bermain dengan DOM menjadi sangat sederhana.

http://docs.jquery.com/Manipulation

Jadikan sesederhana: $ ("# bidang-nama"). Teks ("Beberapa teks baru.");


Prototipe memiliki fungsi utilitas serupa.
ceejayoz


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

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

Lebih baik mengganti node kemudian menghapusnya dan menambahkan yang baru sebagai dua operasi terpisah.
Quentin

0

Ini cara jQuery yang mudah :

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

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

Ini sepertinya ide yang buruk - bagaimana jika elemen Anda berisi subnode dengan teks yang sama, atau teks Anda cocok dengan bagian dari nama tag elemen? MENGAPA tidak hanya menggunakan .text?
James Westgate

Saya sepenuhnya setuju dengan James Westgate, seharusnya tidak melakukan itu.
TGarrett

0

Dalam HTML taruh ini

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

Dalam Javascript taruh ini

var fieldNameElement = document.getElementById('field_name');
        if (fieldNameElement)
        {fieldNameElement.innerHTML = 'some HTML';}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.