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
}
merah muda
sumber
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");
John Topley
sumber
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!";
17 dari 26
sumber
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";
mikemaccana
sumber
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.

Daniel Papasian
sumber
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.

ceejayoz
sumber
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.

AnthonyWJones
sumber
7

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

if (fieldNameElement)
    fieldNameElement.innerHTML = 'some HTML';
Milan Babuškov
sumber
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";
}
palswim
sumber
4
el.innerHTML='';
el.appendChild(document.createTextNode("yo"));
Adrian Adkison
sumber
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.");

Steve Perks
sumber
Prototipe memiliki fungsi utilitas serupa.
ceejayoz
1

Gunakan innerText jika Anda tidak dapat menganggap struktur - Gunakan data Teks # untuk memperbarui Tes Kinerja teks yang ada

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

  fieldNameElement.removeChild(fieldNameElement.firstChild);
  var newText = document.createTextNode("New Text");
  fieldNameElement.appendChild(newText);
}
hollystyles
sumber
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"));
Cosmin
sumber
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';}
Azhar hussain
sumber