PorównaniePorównania

innerHTML vs textContent

innerHTML odczytuje i ustawia kod HTML elementu, parsując napis na nowe elementy, a textContent odczytuje i ustawia czysty tekst, bez znaczników.

Na tej stronie

Porównanie w tabeli

#

Przykład

#
JavaScript
const box = document.querySelector('#box')

console.log(box.innerHTML)
console.log(box.textContent)

box.textContent = 'Wszystkie zadania zrobione'
console.log(box.innerHTML)
Konsola
Ważne: zostały 2 zadania
Ważne: zostały 2 zadania
Wszystkie zadania zrobione

Definicja i zastosowanie

#

Obie właściwości odczytują i nadpisują zawartość elementu, a przypisanie nowej wartości zawsze usuwa dotychczasowe dzieci. Różni je to, jak traktują napis. innerHTML zwraca znaczniki HTML jako tekst i parsuje przypisany napis jako HTML, tworząc z niego prawdziwe elementy. textContent zwraca sam tekst elementu i jego potomków, a przypisany napis wstawia dosłownie, jako jeden węzeł tekstowy.

Z tej różnicy wynika ryzyko. Wstawienie przez innerHTML napisu od użytkownika albo z API otwiera drogę do ataku XSS, bo znaki < i > zamieniają się w działające znaczniki. textContent jest bezpieczny: te same znaki pojawią się na ekranie jako tekst. innerHTML jest też wolniejszy, bo wymaga parsowania HTML, i niszczy obsługę zdarzeń podpiętą do starych elementów przy każdym przypisaniu.

Do wyświetlania tekstu, zwłaszcza danych od użytkownika, używaj textContent. innerHTML zostaw do wstawiania większych fragmentów znanego z góry kodu HTML, na przykład listy zbudowanej w template literal, pamiętając o oczyszczeniu każdej wartości pochodzącej od użytkownika.

Składnia

#
Składnia
const html = element.innerHTML
element.innerHTML = htmlString

const text = element.textContent
element.textContent = newText

Więcej przykładów

#
innerHTML += niszczy stare elementy
JavaScript
const list = document.querySelector('#list')
const firstItem = document.querySelector('#first')

list.innerHTML += '<li>Kolejny krok</li>'

console.log(document.querySelector('#first') === firstItem)
console.log(firstItem.isConnected)
Konsola
false
false

innerHTML += odczytuje cały kod HTML, dolepia nowy fragment i parsuje wszystko od nowa. Nowy element #first wygląda tak samo, ale to inny obiekt, a stary jest odłączony od dokumentu.

textContent pokazuje znaczniki jako tekst
JavaScript
const comment = document.querySelector('#comment')

comment.textContent = 'Użyj <strong>, żeby pogrubić tekst'

console.log(comment.children.length)
console.log(comment.textContent)
Konsola
0
Użyj <strong>, żeby pogrubić tekst

Napis trafia do elementu dosłownie, jako jeden węzeł tekstowy. Znaki < i > nie tworzą znacznika, więc children.length zostaje równe 0.

Dobre praktyki

#
  • Do wyświetlania tekstu od użytkownika zawsze używaj textContent. innerHTML z nieoczyszczonymi danymi to otwarta droga do ataku XSS.
  • Unikaj innerHTML += w pętli: każdy krok przebudowuje całą zawartość od nowa. Zbuduj najpierw cały napis albo użyj insertAdjacentHTML().
  • Do wyczyszczenia elementu wystarczy element.textContent = "", bez ryzyka związanego z parsowaniem HTML.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.