Jaka jest różnica między textContent
i innerText
w JavaScript?
Czy mogę użyć textContent
w następujący sposób:
var logo$ = document.getElementsByClassName('logo')[0];
logo$.textContent = "Example";
javascript
JK
źródło
źródło
innerText
itextContent
zdecydowanie nie są takie same. Wystąpienie pustych przestrzeni w zawartości węzła spowoduje, że dwie właściwości będą dawały inną zawartość, podobnie jakbr
elementy i inne elementy potomne renderowane na poziomie bloków.Odpowiedzi:
Żadnej z pozostałych odpowiedzi nie udaje się dostarczyć pełnego wyjaśnienia, stąd ta. Kluczowe różnice między
innerText
itextContent
są bardzo dobrze opisane w poście Kelly Norton: innerText a textContent . Poniżej znajduje się podsumowanie:innerText
był niestandardowy, podczas gdytextContent
został ustandaryzowany wcześniej.innerText
zwraca widoczny tekst zawarty w węźle, atextContent
zwraca pełny tekst. Na przykład, następujący kod HTML<span>Hello <span style="display: none;">World</span></span>
,innerText
powróci „Hello”, podczas gdytextContent
powróci „Hello World”. Bardziej szczegółową listę różnic można znaleźć w tabeli pod adresem http://perfectionkills.com/the-poor-misunderstood-innerText/ (dalsze czytanie pod adresem „innerText” działa w przeglądarce IE, ale nie w przeglądarce Firefox ).innerText
jest znacznie bardziej obciążony wydajnością: wymaga informacji o układzie, aby zwrócić wynik.innerText
jest definiowany tylko dlaHTMLElement
obiektów, natomiasttextContent
jest definiowany dla wszystkichNode
obiektów.Obejście problemu
textContent
w IE8- obejmowałoby funkcję rekurencyjną używającąnodeValue
na całymchildNodes
określonym węźle, oto próba wypełnienia polyfill:źródło
innerText
zamieni<br>
elementy w znaki nowej linii, atextContent
po prostu je zignoruje. Tak więc 2 słowa zawierające tylko<br>
element między nimi (bez spacji) zostaną połączone podczas używaniatextContent
elem.textContent = 'foobar'
vselem.innerText = 'foobar'
innerText
itextContent
: Jeśli zmienisztext-transform
element elementu za pomocą CSS, wpłynie to na wynik „innerText”, ale nie na wyniktextContent
. Na przykład:innerText
z<div style="text-transform: uppercase;">Hello World</div>
będzie „HELLO WORLD”, atextContent
„Hello World”.textContent
jest jedynym dostępnym dla węzłów tekstowych:W węzłach elementów
innerText
ocenia elementy <br>, atextContent
znaki sterujące:span.innerText
daje:span.textContent
daje:Ciągi ze znakami sterującymi (np. Nowe wiersze) nie są dostępne w przypadku
textContent
, gdy treść została ustawiona za pomocąinnerText
. W drugą stronę (ustaw znaki sterujące ztextContent
), wszystkie znaki są zwracane zarówno z, jakinnerText
itextContent
:źródło
Oba
innerText
itextContent
są znormalizowane od 2016 r. WszystkieNode
obiekty (w tym węzły czystego tekstu) majątextContent
, ale tylkoHTMLElement
obiekty mająinnerText
.Chociaż
textContent
działa z większością przeglądarek, nie działa w IE8 lub starszym. Użyj tego wypełnienia, aby działał tylko w przeglądarce IE8. Ten wypełniacz nie będzie działał z IE7 lub starszymi wersjami.Object.defineProperty
Metoda jest dostępnej w IE9 lub w górę, jednak jest ona dostępna w IE8 dla DOM tylko obiekty.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent
źródło
innerText
jest twoim przyjacielem.Object.defineProperty()
?Dla tych, którzy wygooglowali to pytanie i przybyli tutaj. Czuję, że najbardziej klarowna odpowiedź na to pytanie znajduje się w dokumencie MDN: https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent .
Możesz zapomnieć o wszystkich punktach, które mogą Cię zmylić, ale pamiętaj o dwóch rzeczach:
textContent
jest to zwykle właściwość, której szukasz.innerText
przybliża tekst, który uzyskałby użytkownik, gdyby podświetlił zawartość elementu kursorem, a następnie skopiował do schowka. ItextContent
daje wszystko, widoczne lub ukryte, w tym elementy<script>
i<style>
.źródło
TextContent jest obsługiwany przez większość przeglądarek. Nie jest obsługiwany przez ie8 lub starszą wersję, ale można do tego użyć wypełnienia polyfill
Zobacz http://www.w3schools.com/jsref/prop_node_textcontent.asp
źródło
textContent zwraca pełny tekst i nie dba o widoczność, podczas gdy innerText tak.
Wyjście tekstu Treść:
Dane wyjściowe innerText (zwróć uwagę, że innerText rozpoznaje tagi, takie jak
<br>
i ignoruje ukryty element):źródło
Oprócz wszystkich różnic, które zostały wymienione w innych odpowiedziach, oto kolejna, którą odkryłem dopiero niedawno:
Chociaż
innerText
mówi się, że właściwość jest znormalizowana od 2016 r., Wykazuje różnice między przeglądarkami: Mozilla ignoruje znaki U + 200E i U + 200F („lrm” i „rlm”) winnerText
, podczas gdy Chrome nie.Firefox zgłasza 3 i 2, Chrome raporty 3 i 3.
Nie jestem jeszcze pewien, czy jest to błąd (a jeśli tak, w której przeglądarce), czy tylko jedna z tych dziwacznych niezgodności, z którymi musimy żyć.
źródło
innerHTML wykona nawet tagi HTML, które mogą być niebezpieczne, powodując wszelkiego rodzaju ataki typu client-side injection, takie jak XSS oparty na DOM. Oto fragment kodu:
Jeśli używasz .textContent, nie oceni znaczników HTML i nie wydrukuje go jako String.
Źródła: https://www.scip.ch/en/?labs.20171214
źródło