innerText vs innerHTML vs label vs teks vs textContent vs outerText

124

Saya memiliki daftar dropdown yang diisi oleh Javascript.

Saat memutuskan apa yang seharusnya menjadi nilai default untuk ditampilkan saat dimuat, saya menyadari bahwa properti berikut menunjukkan nilai yang persis sama:

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

Penelitian saya sendiri menunjukkan tes penilaian atau perbandingan antara beberapa di antaranya, tetapi tidak semua.

Saya dapat menggunakan akal sehat saya sendiri dan memilih 1 atau yang lain karena memberikan hasil yang sama, tetapi, saya khawatir ini tidak akan menjadi ide yang baik jika datanya berubah.

Temuan saya adalah:

  • innerText akan menunjukkan nilai sebagaimana adanya dan mengabaikan format HTML apa pun yang mungkin disertakan
  • innerHTML akan menunjukkan nilai dan menerapkan format HTML apa pun
  • labeltampaknya sama dengan innerText, jadi saya tidak bisa melihat perbedaannya
  • texttampaknya sama innerTexttetapi versi singkatan jQuery
  • textContenttampak sama innerTexttetapi tetap memformat (seperti \n)
  • outerText tampaknya sama dengan innerText

Penelitian saya hanya dapat membawa saya sejauh saya hanya dapat menguji apa yang dapat saya pikirkan atau baca apa yang dipublikasikan, dapatkah ada orang yang mengkonfirmasi apakah penelitian saya benar dan jika ada sesuatu yang istimewa tentang labeldan outerText?

MyDaftQuestions
sumber
11
Salah satu alasan mengapa ada begitu banyak cara untuk mengakses teks adalah karena perbedaan lintas browser. Jika Anda sudah menggunakan jQuery, Anda harus menggunakan .text()untuk mendapatkan konten teks elemen, karena itu akan memberikan dukungan lintas-browser yang maksimal.
JLRishe

Jawaban:

101

Dari MDN :

Internet Explorer memperkenalkan element.innerText. Maksudnya kurang lebih sama [seperti textContent] dengan beberapa perbedaan:

  • Perhatikan bahwa sementara textContent mendapatkan konten dari semua elemen, termasuk <script>dan <style>elemen, properti khusus IE yang sebagian besar setara, innerText, tidak.

  • innerText juga mengetahui gaya dan tidak akan mengembalikan teks elemen tersembunyi, sedangkan textContent akan mengembalikannya.

  • Karena innerText mengetahui gaya CSS, ini akan memicu perubahan posisi, sedangkan textContent tidak.

Jadi innerTexttidak akan menyertakan teks yang disembunyikan oleh CSS, tapi textContentakan.

innerHTML mengembalikan HTML seperti namanya. Cukup sering, untuk mengambil atau menulis teks di dalam sebuah elemen, orang menggunakan innerHTML. textContent harus digunakan sebagai gantinya. Karena teks tidak diurai sebagai HTML, kemungkinan memiliki kinerja yang lebih baik. Selain itu, ini menghindari vektor serangan XSS.

Dalam kasus anda tidak terjawab itu, saya ulangi lebih jelas: Do tidak menggunakan .innerHTMLkecuali Anda secara khusus berniat untuk menyisipkan HTML dalam elemen dan telah mengambil tindakan pencegahan yang diperlukan untuk memastikan bahwa HTML Anda memasukkan tidak dapat berisi konten berbahaya. Jika Anda hanya ingin memasukkan teks, gunakan .textContentatau jika Anda perlu mendukung IE8 dan sebelumnya, gunakan deteksi fitur untuk mematikan antara .textContentdan .innerText.

Alasan utama adanya begitu banyak properti yang berbeda adalah karena browser yang berbeda awalnya memiliki nama yang berbeda untuk properti ini, dan masih belum ada dukungan lintas browser yang lengkap untuk semuanya. Jika Anda menggunakan jQuery, Anda harus tetap menggunakannya .text()karena itu dirancang untuk memuluskan perbedaan lintas-browser. *

Untuk beberapa yang lain: outerHTMLpada dasarnya sama dengan innerHTML, kecuali itu termasuk tag awal dan akhir dari elemen miliknya. Saya tidak bisa menemukan banyak penjelasan outerTextsama sekali. Saya pikir itu mungkin properti warisan yang tidak jelas dan harus dihindari.

JLRishe
sumber
3
Masalah dengan saran dokumen itu in order to retrieve or write text within an element, people use innerHTML. textContent should be used instead,, adalah bahwa textContent tidak didukung oleh IE 8, yang masih digunakan secara luas karena itu adalah versi yang dibundel dengan Windows 7. Dan FireFox tidak mendukung innerText . Jadi, meskipun innerHTML tidak cocok untuk tujuan tersebut, ia memiliki keandalan lintas browser yang lebih baik.
Adi Inbar
5
@AdiInbar Jika Anda perlu mendukung browser lama, hal yang benar untuk dilakukan adalah menggunakan deteksi fitur untuk mematikan .textContentdan .innerText, atau menggunakan sesuatu seperti jQuery yang menghaluskan perbedaan browser ini.
JLRishe
1
Terima kasih banyak atas penjelasan ini! Saya menggunakan flot untuk menampilkan grafik dan tidak ditampilkan di ff karena ff menggunakan textContent. Innertext selalu tidak terdefinisi saat saya menggunakan tickFormatter.
Rainhider
1
@bvl Anda tidak dapat menggunakan textContentdengan tag HTML. Jika Anda perlu memasukkan HTML, Anda akan menggunakan .innerHTMLatau membangun node HTML menggunakan document.createElement(), dll.
JLRishe
4
Keamanan: Penggunaan yang salah innerHTML(tidak seperti textContent) dapat membuka pintu untuk serangan XSS (Cross-Site Scripting) pada aplikasi Anda. Jika konten yang dimasukkan ke DOM melalui innerHTMLtidak sepenuhnya dipercaya, penyerang dapat menggunakan <script>elemen untuk membajak aplikasi Anda yang diautentikasi di bawah tingkat otorisasi pengguna atau admin. Semua serangan, termasuk serangan yang tampak aneh seperti <img src="x.x" onerror="alert('Hacked!');"/>dan segudang serangan yang lebih licik secara efektif dihancurkan hanya dengan menggunakan textContentdalam konteks ini, bukan berbahaya innerHTML.
ChaseMoskal
8

Sebuah daftar dropdown terdiri dari sekumpulan Optionobjek, jadi Anda harus menggunakan .textproperti untuk memeriksa representasi tekstual dari elemen tersebut, yaitu

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

Btw,

.texttampaknya sama .innerTexttetapi versi singkatan JQuery

Itu tidak benar; $(element).text()adalah versi jQuery sedangkan element.textversi akses properti.

Mendongkrak
sumber
5

Tambahan untuk jawaban JLRishe yang sebaliknya sangat baik:

Alasan innerText dan outerText ada adalah karena simetri dengan innerHTML dan outerHTML. Ini menjadi penting saat Anda menugaskan ke properti.

Misalkan Anda memiliki elemen edengan kode HTML <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!
Anonim
sumber
2

textContent tidak akan memformat (\ n)

Hariharan
sumber
0

textdan labelhapus spasi ekstra. Saya mendapatkan hasil ini saat menanyakan opsi dalam dropdown:

e.textContent = "A    B C   D     "
e.text = "A B C D"
e.label = "A B C D"
Jay Jay
sumber