Qual é a diferença entre textContent
e innerText
em JavaScript?
Posso usar da textContent
seguinte maneira:
var logo$ = document.getElementsByClassName('logo')[0];
logo$.textContent = "Example";
javascript
JK
fonte
fonte
innerText
etextContent
decididamente não são os mesmos. Ocorrências de espaço em branco no conteúdo do nó farão com que as duas propriedades produzam conteúdo diferente, assim como ocorrências debr
elementos e outros descendentes renderizados no nível do bloco.Respostas:
Nenhuma das outras respostas consegue fornecer a explicação completa, daí esta. As principais diferenças entre
innerText
etextContent
estão descritas muito bem no blog de Kelly Norton: innerText vs. textContent . Abaixo você pode encontrar um resumo:innerText
não era padrão, enquantotextContent
era padronizado anteriormente.innerText
retorna o texto visível contido em um nó, enquantotextContent
retorna o texto completo . Por exemplo, no seguinte HTML<span>Hello <span style="display: none;">World</span></span>
,innerText
retornará 'Hello', enquantotextContent
retornará 'Hello World'. Para obter uma lista mais completa das diferenças, consulte a tabela em http://perfectionkills.com/the-poor-misunderstood-innerText/ (a leitura adicional em 'innerText' funciona no IE, mas não no Firefox ).innerText
tem muito mais desempenho: requer informações de layout para retornar o resultado.innerText
é definido apenas paraHTMLElement
objetos, enquantotextContent
é definido para todos osNode
objetos.Uma solução alternativa para o
textContent
IE8- envolveria uma função recursiva usandonodeValue
em todochildNodes
o nó especificado. Aqui está uma tentativa em um polyfill:fonte
innerText
transformará<br>
elementos em caracteres de nova linha, enquantotextContent
os ignorará. Então 2 palavras com apenas uma<br>
elemento entre eles (e sem espaços) serão concatenados ao usartextContent
elem.textContent = 'foobar'
vselem.innerText = 'foobar'
innerText
etextContent
: Se você alterar otext-transform
elemento de um CSS, ele afetará o resultado de 'innerText', mas não o resultado detextContent
. Por exemplo:innerText
of<div style="text-transform: uppercase;">Hello World</div>
será "HELLO WORLD", enquantotextContent
será "Hello World".textContent
é o único disponível para nós de texto:Nos nós do elemento,
innerText
avalia <br> elementos, enquantotextContent
avalia caracteres de controle:span.innerText
dá:span.textContent
dá:Seqüências de caracteres com caracteres de controle (por exemplo, feeds de linha) não estarão disponíveis
textContent
se o conteúdo tiver sido definido cominnerText
. Por outro lado (definir caracteres de controle comtextContent
), todos os caracteres são retornados cominnerText
etextContent
:fonte
Ambos
innerText
&textContent
são padronizados a partir de 2016. Todos osNode
objetos (incluindo os nós de texto puro) têmtextContent
, mas apenasHTMLElement
objetos têminnerText
.Embora
textContent
funcione com a maioria dos navegadores, ele não funciona no IE8 ou anterior. Use esse polyfill para funcionar apenas no IE8. Esse polyfill não funcionará com o IE7 ou anterior.o
Object.defineProperty
método está disponível no IE9 ou superior, no entanto, está disponível no IE8 apenas para objetos DOM.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
fonte
innerText
é seu amigo.Object.defineProperty()
?Para quem pesquisou esta questão e chegou aqui. Sinto que a resposta mais clara para essa pergunta está no documento MDN: https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent .
Você pode esquecer todos os pontos que podem confundi-lo, mas lembre-se de duas coisas:
textContent
geralmente é a propriedade que você está procurando.innerText
aproxima o texto que o usuário obteria se destacasse o conteúdo do elemento com o cursor e depois copiasse para a área de transferência. EtextContent
fornece tudo, visível ou oculto, incluindo<script>
e<style>
elementos.fonte
textContent é suportado pela maioria dos navegadores. Não é suportado pelo ie8 ou anterior, mas um polyfill pode ser usado para esse
Consulte http://www.w3schools.com/jsref/prop_node_textcontent.asp
fonte
textContent retorna texto completo e não se preocupa com a visibilidade, enquanto innerText sim.
Saída de textContent:
Saída de innerText (observe como innerText está ciente de tags como
<br>
e ignora o elemento oculto):fonte
Além de todas as diferenças que foram nomeadas nas outras respostas, aqui está outra que eu descobri recentemente:
Embora se
innerText
diga que a propriedade foi padronizada desde 2016, ela exibe diferenças entre os navegadores: o Mozilla ignora os caracteres U + 200E e U + 200F ("lrm" e "rlm")innerText
, enquanto o Chrome não.O Firefox relata 3 e 2, o Chrome relata 3 e 3.
Ainda não tenho certeza se isso é um bug (e se sim, em qual navegador) ou apenas uma daquelas incompatibilidades peculiares com as quais temos que conviver.
fonte
innerHTML executará até as tags HTML que podem ser perigosas, causando qualquer tipo de ataque de injeção no cliente, como o XSS baseado em DOM. Aqui está o trecho de código:
Se você usar .textContent, ele não avaliará as tags HTML e as imprimirá como String.
Referência: https://www.scip.ch/en/?labs.20171214
fonte