innerText vs innerHTML vs label vs text vs textContent vs externalText


124

Mam listę rozwijaną, która jest wypełniona przez Javascript.

Decydując o tym, jaka powinna być domyślna wartość do wyświetlenia podczas ładowania, zdałem sobie sprawę, że następujące właściwości pokazują dokładnie te same wartości:

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

Moje własne badania pokazują testy benchmarkingowe lub porównania kilku z nich, ale nie wszystkich.

Mogę użyć własnego zdrowego rozsądku i wybrać 1 lub inny, ponieważ dają one ten sam wynik, ale obawiam się, że nie będzie to dobry pomysł, jeśli dane miałyby się zmienić.

Moje ustalenia są następujące:

  • innerText pokaże wartość taką jaka jest i zignoruje jakiekolwiek formatowanie HTML, które może być zawarte
  • innerHTML pokaże wartość i zastosuje formatowanie HTML
  • labelwydaje się być taki sam jak innerText, więc nie widzę różnicy
  • textwydaje się być tym samym, innerTextale wersja skrócona jQuery
  • textContentwygląda tak samo jak, innerTextale zachowuje formatowanie (takie jak \n)
  • outerText wydaje się być taki sam jak innerText

Moje badania mogą doprowadzić mnie tylko do tego stopnia, że ​​mogę tylko przetestować to, o czym myślę lub przeczytać, co zostało opublikowane, czy ktoś może jednak potwierdzić, czy moje badania są prawidłowe i czy jest coś specjalnego w labeli outerText?


11
Jednym z powodów, dla których istnieje tak wiele różnych sposobów dostępu do tekstu, są różnice między przeglądarkami. Jeśli już używasz jQuery, powinieneś użyć, .text()aby uzyskać zawartość tekstową elementu, ponieważ zapewni to maksymalne wsparcie dla różnych przeglądarek.
JLRishe

Odpowiedzi:


101

Z MDN :

Internet Explorer wprowadził element.innerText. Zamiar jest prawie taki sam [jak textContent], z kilkoma różnicami:

  • Zwróć uwagę, że chociaż textContent pobiera zawartość wszystkich elementów, w tym elementów <script>i <style>, w większości równoważna właściwość specyficzna dla IE, innerText, nie.

  • innerText jest również świadoma stylu i nie zwróci tekstu ukrytych elementów, podczas gdy textContent to zrobi.

  • Ponieważ innerText jest świadome stylu CSS, wywoła zmianę przepływu, podczas gdy textContent nie.

Więc innerTextnie będzie zawierać tekstu, który jest ukryty przez CSS, ale textContentbędzie.

innerHTML zwraca kod HTML zgodnie z jego nazwą. Dość często, aby pobrać lub napisać tekst w elemencie, ludzie używają innerHTML. Zamiast tego należy użyć textContent. Ponieważ tekst nie jest analizowany jako HTML, prawdopodobnie będzie miał lepszą wydajność. Co więcej, pozwala to uniknąć wektora ataku XSS.

W przypadku, gdy brakowało, że powtórzę to jaśniej: Do nie używać .innerHTML, chyba że wyraźnie zamiar wstawić w obrębie elementu HTML i podjęły niezbędne środki ostrożności w celu zapewnienia, że HTML wstawiasz nie może zawierać szkodliwą zawartość. Jeśli chcesz wstawić tylko tekst, użyj .textContentlub jeśli potrzebujesz obsługiwać IE8 i starsze wersje, użyj wykrywania funkcji, aby wyłączyć między .textContenta .innerText.

Głównym powodem, dla którego istnieje tak wiele różnych właściwości, jest to, że różne przeglądarki miały pierwotnie różne nazwy tych właściwości i nadal nie ma pełnej obsługi wszystkich przeglądarek dla nich wszystkich. Jeśli używasz jQuery, powinieneś się trzymać, .text()ponieważ jest to zaprojektowane tak, aby wygładzać różnice między przeglądarkami. *

W przypadku niektórych innych: outerHTMLjest w zasadzie taki sam jak innerHTML, z wyjątkiem tego, że zawiera znacznik początkowy i końcowy elementu, do którego należy. Nie mogę znaleźć żadnego opisu outerText. Myślę, że jest to prawdopodobnie mało znana własność, której należy unikać.


3
Problem z radą tego dokumentu in order to retrieve or write text within an element, people use innerHTML. textContent should be used insteadpolega na tym, że textContent nie jest obsługiwany przez IE 8, który jest nadal w dość powszechnym użyciu, ponieważ jest to wersja dołączona do systemu Windows 7. A FireFox nie obsługuje innerText . Więc chociaż innerHTML nie jest idealnie dostosowana do tego celu, ma lepszą niezawodność w różnych przeglądarkach.
Adi Inbar

5
@AdiInbar Jeśli potrzebujesz obsługi starych przeglądarek, właściwą rzeczą do zrobienia jest użycie wykrywania funkcji, aby wyłączyć między .textContenti .innerText, lub użyć czegoś takiego jak jQuery, które wyrównuje te różnice między przeglądarkami.
JLRishe

1
Bardzo dziękuję za to wyjaśnienie! Używam flot do wyświetlania wykresów i nie jest wyświetlany w ff, ponieważ ff używa textContent. Gdy użyłem metody tickFormatter, tekst wewnętrzny był zawsze niezdefiniowany.
Rainhider,

1
@bvl Nie można używać textContentz tagami HTML. Jeśli potrzebujesz wstawić HTML, użyjesz .innerHTMLlub zbudujesz węzły HTML za pomocą document.createElement()itp.
JLRishe

4
Bezpieczeństwo: Niepoprawne użycie innerHTML(w przeciwieństwie textContent) może otworzyć drzwi dla ataków XSS (Cross-Site Scripting) na twoją aplikację. Jeśli zawartość wstawiana do DOM za pośrednictwem innerHTMLnie jest w pełni zaufana, osoba atakująca może użyć <script>elementu do przejęcia aplikacji uwierzytelnionej na poziomie autoryzacji użytkownika lub administratora. Wszystkie ataki, w tym dziwnie wyglądające ataki, jak <img src="x.x" onerror="alert('Hacked!');"/>i niezliczone podstępne, są skutecznie niszczone przez proste użycie textContentw tym kontekście zamiast niebezpiecznych innerHTML.
ChaseMoskal

8

Lista rozwijana zawiera zbiór Optionobiektów, więc powinieneś użyć .textwłaściwości do sprawdzenia tekstowej reprezentacji elementu, tj.

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

Przy okazji,

.textwydaje się być tym samym, .innerTextale wersja skrócona JQuery

To nie jest poprawne; $(element).text()jest wersją jQuery, a wersją element.textdostępu do właściwości.


5

Dodatek do znakomitej odpowiedzi JLRishe'a:

Przyczyną istnienia innerText i externalText jest symetria z innerHTML i externalHTML. Staje się to ważne podczas przypisywania do nieruchomości.

Załóżmy, że masz element ez kodem 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!



0

texti labelusuń dodatkowe spacje. Otrzymałem następujące wyniki podczas sprawdzania opcji w menu rozwijanym:

e.textContent = "A    B C   D     "
e.text = "A B C D"
e.label = "A B C D"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.