innerText, innerHTML, etiket ve metin, textContent ve externalText karşılaştırması


124

Javascript tarafından doldurulan bir açılır listem var.

Yükte gösterilecek varsayılan değerin ne olması gerektiğine karar verirken, aşağıdaki özelliklerin tamamen aynı değerleri gösterdiğini fark ettim:

  • innerText
  • innerHtml
  • label
  • text
  • textContent
  • outerText

Kendi araştırmam, kıyaslama testlerini veya bunların birkaçı arasında karşılaştırmaları gösteriyor, ancak hepsi değil.

Kendi sağduyumu kullanabilirim ve aynı sonucu verdikleri için birini veya diğerini seçebilirim, ancak verilerin değişmesi durumunda bunun iyi bir fikir olmayacağından endişe ediyorum.

Bulgularım:

  • innerText değeri olduğu gibi gösterir ve dahil edilebilecek tüm HTML biçimlendirmelerini yok sayar
  • innerHTML değeri gösterir ve herhangi bir HTML biçimlendirmesini uygular
  • labelile aynı görünüyor innerText, bu yüzden farkı göremiyorum
  • textinnerTextjQuery kısaltılmış sürümü ile aynı gibi görünüyor
  • textContentaynı gibi görünür innerTextancak biçimlendirmeyi korur (örneğin \n)
  • outerText ile aynı gibi görünüyor innerText

Araştırmam beni ancak düşünebildiğimi test edebildiğim veya yayınlananları okuyabildiğim kadar ileri götürebilir, herhangi biri araştırmamın doğru olup olmadığını labelve ve hakkında özel bir şey olup olmadığını doğrulayabilir outerTextmi?


11
Metne erişmenin bu kadar çok farklı yolunun olmasının nedenlerinden biri, tarayıcılar arası farklılıklardır. Zaten jQuery kullanıyorsanız, .text()bir elemanın metin içeriğini almak için kullanmalısınız , çünkü bu maksimum tarayıcılar arası destek sağlayacaktır.
JLRishe

Yanıtlar:


101

Gönderen MDN'yi :

Internet Explorer element.innerText'i tanıttı. Niyet, birkaç farklılık dışında [textContent ile] hemen hemen aynıdır:

  • TextContent, <script>ve <style>öğeleri dahil tüm öğelerin içeriğini alırken , çoğunlukla eşdeğer IE'ye özgü olan innerText özelliğinin bunu almadığını unutmayın.

  • innerText ayrıca stilin farkındadır ve gizli öğelerin metnini döndürmez, oysa textContent.

  • İnnerText, CSS stilinin farkında olduğundan, bir yeniden akışı tetikleyecek, ancak textContent tetiklemeyecektir.

Dolayısıyla innerText, CSS tarafından gizlenen metni içermez, ancak gizler textContent.

innerHTML, adından da anlaşılacağı gibi HTML'yi döndürür. Çoğu zaman, bir öğenin içindeki metni almak veya yazmak için, insanlar innerHTML kullanırlar. Bunun yerine textContent kullanılmalıdır. Metin HTML olarak ayrıştırılmadığından, muhtemelen daha iyi performansa sahip olacaktır. Dahası, bu bir XSS saldırı vektörünü önler.

Eğer o cevapsız, beni daha net bir şekilde tekrar bakalım: Do not kullanmak .innerHTMLÖzellikle bir öğesi içinde insert HTML niyetinde ve ekleme HTML zararlı içerik içeremez sağlamak için gerekli tedbirleri almış sürece. Yalnızca metin, kullanımını eklemek istiyorsanız .textContentsize IE8 desteklemek gerekmez ve daha önceki veya eğer, kullanım özelliği algılama arasındaki kapatmak .textContentve .innerText.

Bu kadar çok farklı özellik olmasının ana nedeni, farklı tarayıcıların bu özellikler için orijinal olarak farklı adlara sahip olması ve yine de tümü için tam bir tarayıcılar arası desteğin olmamasıdır. JQuery kullanıyorsanız, .text()tarayıcılar arası farklılıkları gidermek için tasarlandığından bağlı kalmalısınız . *

Diğerleri için: ait outerHTMLolduğu innerHTMLöğenin başlangıç ​​ve bitiş etiketlerini içermesi dışında temelde aynıdır . Hiç tanımlayamıyorum outerText. Bunun muhtemelen belirsiz bir miras mülk olduğunu ve bundan kaçınılması gerektiğini düşünüyorum.


3
Bu dokümanın tavsiyesiyle ilgili sorun in order to retrieve or write text within an element, people use innerHTML. textContent should be used instead, textContent'in IE 8 tarafından desteklenmemesidir, bu hala oldukça yaygın kullanımdadır çünkü bu, Windows 7 ile birlikte gelen sürümdür. Ve FireFox, innerText'i desteklemez . Bu nedenle, innerHTML amaç için ideal olarak uygun olmasa da, tarayıcılar arası daha iyi güvenilirliğe sahiptir.
Adi Inbar

5
Eski tarayıcılar desteklemek için gerekirse @AdiInbar, yapılacak doğru şey arasında kapatmak için özellik algılama kullanmaktır .textContentve .innerTextjQuery gibi bir şey veya kullanımı konusunda o bu tarayıcı farkı hafifletir.
JLRishe

1
Bu açıklama için çok teşekkür ederim! Grafikleri görüntülemek için flot kullanıyorum ve ff textContent kullandığı için ff'de gösterilmiyor. TickFormatter'ı kullandığımda iç metin her zaman tanımsızdı.
Rainhider

1
@bvl textContentHTML etiketleriyle kullanamazsınız . HTML eklemeniz gerekirse , vb. .innerHTMLKullanarak HTML düğümleri kullanır ya da oluşturursunuz document.createElement().
JLRishe

4
Güvenlik: Hatalı kullanımı innerHTML(aksine textContent), uygulamanıza XSS (Siteler Arası Komut Dosyası) saldırıları için kapıyı açabilir. DOM üzerinden DOM'a eklenen içerik innerHTMLtamamen güvenilir değilse, saldırgan, <script>bir kullanıcı veya yöneticinin yetkilendirme düzeyi altında kimliği doğrulanmış uygulamanızı ele geçirmek için bir öğe kullanabilir . Tuhaf görünümlü saldırılar <img src="x.x" onerror="alert('Hacked!');"/>ve sayısız sinsi saldırılar da dahil olmak üzere tüm saldırılar, textContenttehlikeli yerine basitçe bu bağlamda kullanılarak etkili bir şekilde yok edilir innerHTML.
ChaseMoskal

8

Açılır liste, Optionnesnelerin bir koleksiyonunu içerir , bu nedenle .textözelliği, öğenin metinsel temsilini incelemek için kullanmalısınız.

<option value="123">text goes here</option>
                    ^^^^^^^^^^^^^^

btw,

.text.innerTextJQuery'nin kısaltılmış sürümü ile aynı görünüyor

Bu doğru değil; $(element).text()jQuery sürümü element.text, özellik erişim sürümüdür.


5

JLRishe'nin başka türlü mükemmel cevabına ek:

Hem innerText hem de externalText'in var olma nedeni, innerHTML ve externalHTML ile simetri içindir. Bu , mülke atadığınızda önemli hale gelir .

eHTML kodlu bir öğeniz olduğunu varsayalım <b>Lorem Ipsum</b>:

e.innerHTML = "<i>Hello</i> World!"; => <b><i>Hello</i> World!</b>
e.outerHTML = "<i>Hello</i> World!"; =>    <i>Hello</i> World!
e.innerText = "Hello World!";        => <b>Hello World!</b>
e.outerText = "Hello World!";        =>    Hello World!



0

textve labelfazla boşlukları kaldırın. Bir açılır listedeki seçenekleri sorgularken şu sonuçları aldım:

e.textContent = "A    B C   D     "
e.text = "A B C D"
e.label = "A B C D"
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.