Bir div öğesinin içindeki metni nasıl değiştiririm?


166

Bir DIV öğesi içindeki metni dinamik olarak ayarlamam gerekiyor. Tarayıcı için en iyi yaklaşım hangisidir? Prototiplerim ve senaryomuz var.

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

İşlev şu şekilde görünecektir:

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

Kabul edilen cevap aşağıdaki gibi bir metin atandığında istediğiniz şeyi yapar mı: - <span style = "font-size: 36pt"> Bu büyük </span>. Bu davranış isteniyorsa, eşleşmesi gereken soruyu yeniden ifade edebilir misiniz?
AnthonyWJones

Bu bir XSS enjeksiyon saldırısında kullanılabilir mi?
James Westgate

Yanıtlar:


49

Ben updatedüz metin, bir HTML snippet'i veya bir toStringyöntemi tanımlayan herhangi bir JavaScript nesnesini destekleyen Prototype yöntemini kullanırdım.

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

26
@Aeyoun OP zaten Prototip kullandıklarını ima etti, bu durumda bundan faydalanmak mantıklı.
John Topley

6
Neden bana sadece$("field_name").text("new text");
Drako

@Drako PrototyJS kullanıyor musunuz?
John Topley

10
@Drako Orijinal soru ve yedi yıl önceki cevabım jQuery için değil PrototypeJS içindir.
John Topley

255

Sadece şunu kullanabilirsiniz:

fieldNameElement.innerHTML = "My new text!";

2
'Statik' metin için tek tırnak kullanılmamalı mı?
Milan Babuškov

5
PHP'de evet. JavaScript'te bunun önemli olduğuna inanmıyorum.
ceejayoz

46
Javascript'te tek ve çift tırnaklar birbirinin yerine kullanılabilir.
17 of 26

18
kötü tavsiye, çünkü metin yanlışlıkla HTML işaretlemesi benzeri içerik içerebilir
Trident D'Gao

10
element.innerHTML = "<script>doSomethingMalicious()</script>";iyi bir fikir olmayacak. element.innerHTML = "& neither will this";
Joseph Nields

175

2013 ve sonrasında bunu okuyan herkes için güncellendi:

Bu cevabın çok fazla SEO'su var, ancak tüm cevaplar ciddi şekilde güncel değil ve mevcut tüm tarayıcıların kutudan çıkardıkları şeyleri yapmak için kütüphanelere bağlı.

Bir div öğesinin içindeki metni değiştirmek için, geçerli tüm tarayıcılarda sağlanan Node.textContent öğesini kullanın.

fieldNameElement.textContent = "New text";

10
@Legolas Bu nedenle iki yıl önce 'mevcut tarayıcı' yazıyor.
mikemaccana

2
Teşekkür ederim! Diğer yanıtları deniyordum, 'innerHTML' nin neden çalışmadığını merak ediyordum.
GreySage

2
Neden textContentdaha üstün bir yöntem olduğunu ayrıntılı olarak düşünebilirsiniz innerHTML: HTML işaretlemesi eklemeye çalışmadığınızda daha hızlı, daha güvenli ve daha uygundur.
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));
}

Bu şekilde yapmanın avantajları:

  1. Yalnızca DOM kullanır, bu nedenle teknik diğer diller için taşınabilirdir ve standart dışı innerHTML'ye güvenmez
  2. fieldName, XSS saldırısına teşebbüs olabilecek HTML içerebilir. Bunun sadece metin olduğunu biliyorsanız, tarayıcının HTML için ayrıştırmasını sağlamak yerine bir metin düğümü oluşturmalıyız

Bir javascript kitaplığı kullanacak olsaydım, jQuery kullanmak ve bunu yapmak:


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

@AnthonyWJones öğesinin yorumunun doğru olduğunu unutmayın : "field_name" özellikle açıklayıcı bir kimlik veya değişken adı değildir.


Bu tekniği başka hangi dillere taşıyabilirsiniz?
John Topley

DOM uygulamasına sahip herhangi bir dil bunu destekler (ve çoğu dilde bir DOM uygulaması vardır).
Quentin

Bu iyi bir cevap, benimkinden daha iyi ve doğru cevap. Yine de örneği derlemeyi düşünebilirsiniz. 'fieldname', işlevin parametresi için iyi bir ad değildir. Aslında öğe kimliği için iki tane ve içerik için başka bir tane almak en iyisi olabilir; elemID, içerik
AnthonyWJones

Sorunun kendisinden fieldName ve ID ödünç aldım.
Daniel Papasian

Soru, örneği genel yapmak için alan_adı muhtemelen kullanmıştır. Ayrıca anketör Prototip'in kullanılabilir olduğunu ancak jQuery'den bahsetmediğini belirtiyor.
John Topley

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

Prototipin şık özelliklerinden $('field_name')biri de aynı şeyi yapmasıdır document.getElementById('field_name'). Kullanın! :-)

John Topley'nin Prototip updateişlevini kullanarak verdiği cevap da iyi bir çözüm.


4
JavaScript gibi görünmüyor mu?
Milan Babuškov

1
İnnerHTML kullanmayın. Bu bir w3c önerisi değildir ve tutarsız davranır. Kötü stil olarak kabul edilir.
Tom

Tom, bunun yerine ne kullanılmalı (Prototip kullanmıyorsanız)?
Milan Babuškov

1
Milan, daha kabul edilen yol childNodes arasında döngü yapmak, her birine removeNode (true) çağırmak ve daha sonra document.createElement () veya document.createTextNode () kullanılarak oluşturulan yeni düğümleri eklemektir. Bunu yapmanız gerekiyorsa, çok fazla yazmayı önlemek için bir işlev yazmanızı öneririm.
Joel Anair

3
@RaduSimionescu Hayır, değil. Bu soru ve cevap jQuery ile değil, Prototype.js ile ilgilidir. Prototip'te $bir öğeyi kimliğe göre arar. JQuery gibi seçici tabanlı değil. api.prototypejs.org/dom/dollar
ceejayoz

15

Hızlı cevap innerHTML'yi (veya prototipin hemen hemen aynı şey olan güncelleme yöntemini) kullanmaktır. İnnerHTML ile ilgili sorun, atanan içerikten kaçmanız gerektiğidir. Hedeflerinize bağlı olarak bunu başka bir kodla VEYA

IE'de: -

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

FF içinde: -

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

(Aslında FF aşağıdakiler kod ile mevcuttur)

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

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

Mümkün olan en geniş tarayıcı desteğine ihtiyacınız varsa, sadece innerText'i kullanabilirim, o zaman bu tam bir çözüm değildir ama raw'da innerHTML kullanmaz.


7

Gerçekten kaldığınız yerden devam etmemizi istiyorsanız, şunları yapabilirsiniz:

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

5

nodeValue ayrıca kullanabileceğiniz standart bir DOM özelliğidir:

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


1

Sitenizde çok fazla JavaScript kullanmaya başlama eğilimindeyseniz, jQuery DOM ile oynamayı son derece basit hale getirir.

http://docs.jquery.com/Manipulation

Bunu şu kadar basit hale getirir: $ ("# field-name"). Text ("Bazı yeni metinler");


Prototip benzer yardımcı program işlevlerine sahiptir.
ceejayoz


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

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

Düğümü değiştirmek ve kaldırmak için iki ayrı işlem olarak yeni bir tane eklemek daha iyidir.
Quentin

0

İşte kolay bir jQuery yolu:

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

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

Bu kötü bir fikir gibi görünüyor - ya öğeniz aynı metne sahip alt düğümler içeriyorsa ya da metniniz bir öğe etiketi adının eşleşen bir parçasını içeriyorsa? Neden sadece .text kullanmıyorsunuz?
James Westgate

James Westgate ile tamamen aynı fikirdeyim, bunu yapmamalıyım.
TGarrett

0

HTML'de bunu koy

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

Javascript bunu koydu

var fieldNameElement = document.getElementById('field_name');
        if (fieldNameElement)
        {fieldNameElement.innerHTML = 'some HTML';}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.