JavaScript'te span öğesinin metnini nasıl değiştirebilirim?


388

Eğer bir açıklığım varsa, söyle:

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

"Hereismytext" i "newtext" olarak değiştirmek için JavaScript'i nasıl kullanabilirim?

Yanıtlar:


636

Modern tarayıcılar için şunları kullanmalısınız:

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

Eski tarayıcılar bilmese de, yeni metin kullanıcı girişi olduğunda XSS güvenlik açığı getirdiğinden textContentkullanılması önerilmez innerHTML(daha ayrıntılı bir tartışma için aşağıdaki diğer yanıtlara bakın):

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

2
@bouncingHippo document.getElementById ("myspan"). setAttribute ("stil", "cssvalues");
Gregoire

3
bu iki cevabı bir araya getirmenin bir yolu olmalı. aynı cevap.
Hermann Ingjaldsson

7
Bu metni ayarlamaz , temelde farklı olan HTML'yi ayarlar .
Brad

22
@gregoire - Diğerlerinin de belirttiği gibi, cevabınız XSS'ye karşı savunmasız. Bu soru yaklaşık 80 bin kez incelendi, yani birçok insan muhtemelen bu çözümü devraldı ve gereksiz xss sızıntıları getirmiş olabilir. textContentBunun yerine yanıtınızı , yeni kişilerin uygun ve güvenli yöntemleri kullanmaya teşvik edilecek şekilde güncellemeyi düşünür müsünüz ?
Tiddo

2
@Tiddo textContent IE8 ve sonraki sürümlerde desteklenmez ve umarım sizin için betiğinizde doğrudan sterilize edilmemiş kullanıcı girişi kullanmazsınız.
Gregoire

75

Kullanılması innerHTML edilir SO TAVSİYE DEĞİLDİR . Bunun yerine, bir textNode oluşturmalısınız. Bu şekilde metninizi "bağlarsınız" ve en azından bu durumda bir XSS saldırısına karşı savunmasız kalmazsınız.

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

Doğru yol:

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

Bu güvenlik açığı hakkında daha fazla bilgi için: Siteler Arası Komut Dosyası Oluşturma (XSS) - OWASP

4 Kasım 2017'de düzenlendi:

@Mumush önerisine göre üçüncü kod satırı değiştirildi : "bunun yerine appendChild (); kullanın".
Btw, @Jimbo Jonny'a göre, katmanlara göre Güvenlik prensibi uygulanarak her şeyin kullanıcı girişi olarak ele alınması gerektiğini düşünüyorum. Bu şekilde sürprizlerle karşılaşmazsınız.


6
innerHTMLDikkatli olma konusunda kesinlikle haklı olsanız da , çözümünüzün innerTextFirefox'ta desteklenmeyen özellikleri kullandığını unutmayın . quirksmode.org/dom/html Ayrıca IE8'detextContent desteklenmeyen kullanır . Bu sorunları aşmak için kod yapılandırabilirsiniz.
Trott

4
span.appendChild(txt);Bunun yerine kullanın !
mumush

34
Soru, kullanıcı girdisi hakkında hiçbir şey söylemiyor, bu nedenle innerHTMLönerilmeyen bir battaniye ifadesi saçma. Bir kez dezenfekte edildiğinde hala iyi olduğunu belirtmiyoruz. Kullanıcı girişini sterilize etmesi gerektiği fikri bu özel soru ile İLGİLİ DEĞİLDİR . En sonunda "btw: kullanıcı girdisi ise önce sterilize ettiğinizden emin olun veya gerekmeyen X yöntemini kullanın" diyen küçük bir notu hak ediyor .
Jimbo Jonny

Ayrıca, eleman oluşturmak innerHTML kullanmaktan daha hızlıdır.
Samuel Rondeau-Millaire

4
AppendChild kullanmak metni gerçekten değiştirmez , sadece metne ekler. Kodunuzu burada kullanmak, orijinal sorunun kapsamı "burada metin serin metin" okumak sonunda. Belki de span.innerHTML = "";appendChild?
ShaneSauce

29
document.getElementById('myspan').innerHTML = 'newtext';

24

EDIT: Bu 2014 yılında yazılmıştır. Muhtemelen artık IE8 umurumda değil ve kullanmayı unutabilirsiniz innerText. Sadece kullan textContentve onunla bitir hooray.

Metni sağlayan sizseniz ve metnin hiçbir kısmı kullanıcı tarafından (veya denetlemediğiniz başka bir kaynak) sağlanmazsa, ayar innerHTMLkabul edilebilir:

// * 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';

Bununla birlikte, diğerlerinin belirttiği gibi, metin dizesinin herhangi bir bölümünün kaynağı değilseniz, önce metni innerHTMLdüzgün bir şekilde sterilize etmeye dikkat etmezseniz , kullanmak sizi XSS gibi içerik enjeksiyon saldırılarına maruz bırakabilir.

Kullanıcının girdisini kullanıyorsanız, tarayıcılar arası uyumluluğu da korurken, bunu güvenli bir şekilde yapmanın bir yolu vardır:

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

Firefox desteklemiyor innerTextve IE8 desteklemiyor, textContentbu nedenle çapraz tarayıcı uyumluluğunu korumak istiyorsanız her ikisini de kullanmanız gerekiyor.

Ve mümkünse yeniden akışlardan (neden olduğu innerText) kaçınmak istiyorsanız :

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

18

Kullanıyorum Jqueryve yukarıdakilerin hiçbiri yardımcı olmadı, nedenini bilmiyorum ama bu işe yaradı:

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

7

İşte başka bir yol:

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

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

İnnerText özelliği Safari, Google Chrome ve MSIE tarafından algılanacaktır. Firefox için, bir şeyler yapmanın standart yolu textContent kullanmaktı, ancak 45 sürümünden beri, birisinin son zamanlarda nazikçe beni tuttuğu gibi, innerText özelliğine de sahip. Bu çözüm, bir tarayıcının bu özelliklerden birini destekleyip desteklemediğini test eder ve öyleyse "newtext" atar.

Canlı demo: burada


1
Firefox, 45 numaralı sürümde innerText desteğini uyguladı .
user3351605

4

Yukarıdaki saf javascript cevaplarına ek olarak, jQuery metin yöntemini aşağıdaki gibi kullanabilirsiniz :

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

Bir yayılma alanı veya div öğelerinin html içeriğini almak / değiştirmek için cevabı genişletmeniz gerekiyorsa , bunu yapabilirsiniz:

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

Referanslar:

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

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


1

Yöntem, belirtilen seçiciye sahip ilk öğeyi döndürdüğünden 'myspan' kimliğinin benzersiz olduğunu varsayarak querySelector () yöntemini de kullanabilirsiniz:

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

developer.mozilla



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

bu, kimliğine sahip dom-düğümü seçer myspanve metin içeriğininew text


0

Yapabilirsin

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


verdiğim cevapla ne farkı var?
Addis

-1

Bu açıklık için

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

Şunun gibi gidebilirsiniz: -

$("name").firstChild.nodeValue = "Hello" + "World";
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.