Eu tenho algum código JavaScript que funciona no IE contendo o seguinte:
myElement.innerText = "foo";
No entanto, parece que a propriedade 'innerText' não funciona no Firefox. Existe algum equivalente do Firefox? Ou existe uma propriedade entre navegadores mais genérica que pode ser usada?
Respostas:
O Firefox usa a propriedade textContent compatível com W3C .
Eu acho que o Safari e o Opera também suportam essa propriedade.
fonte
innerText
é / será apoiada no FF a partir de 2016.innerText
apenas e esperar que funcione (com possíveis peculiaridades) em todos os navegadores atuais em um futuro próximo e no IE antigo também.innerText
é profundamente diferente detextContent
, e na verdade é muito útil (surpreendentemente, de uma suposta peculiaridade do IE ...):innerText
tenta fornecer uma aproximação de como o texto é realmente apresentado no navegador, totalmente diferentetextContent
, que retorna quase a tag- fonte de marcação despojada , agregando pouco valor ou até problemas extras (como a perda dos limites das palavras).Atualização : escrevi uma postagem no blog detalhando todas as diferenças muito melhor.
O Firefox usa o padrão W3C
Node::textContent
, mas seu comportamento difere "levemente" do do proprietário do MSHTMLinnerText
(copiado pelo Opera também, há algum tempo, entre dezenas de outros recursos do MSHTML).Primeiro de tudo, a
textContent
representação de espaço em branco é diferente deinnerText
um. Segundo, e mais importante,textContent
inclui todo o conteúdo da tag SCRIPT , enquanto o innerText não.Apenas para tornar as coisas mais divertidas, o Opera - além de implementar o padrão
textContent
- decidiu também adicionar MSHTMLs,innerText
mas mudou para atuar comotextContent
- isto é, incluindo o conteúdo do SCRIPT (de fato,textContent
einnerText
no Opera parecem produzir resultados idênticos, provavelmente sendo apenas um alias para o outro) .textContent
faz parte daNode
interface, ao passo queinnerText
faz parteHTMLElement
. Isso, por exemplo, significa que você pode "recuperar",textContent
mas nãoinnerText
dos nós de texto:Por fim, o Safari 2.x também possui
innerText
implementação de bugs . No Safari,innerText
funciona corretamente apenas se um elemento não estiver oculto (viastyle.display == "none"
) ou órfão do documento. Caso contrário,innerText
resulta em uma sequência vazia.Eu estava brincando com
textContent
abstração (para contornar essas deficiências), mas acabou sendo bastante complexo .Sua melhor aposta é definir primeiro os requisitos exatos e seguir a partir daí. Muitas vezes, é possível simplesmente remover as tags
innerHTML
de um elemento, em vez de lidar com todos os possíveistextContent
/innerText
desvios.Outra possibilidade, é claro, é percorrer a árvore DOM e coletar nós de texto recursivamente.
fonte
innerText
no Chrome. jsperf.com/text-content/3textContent
agora é suportado no IE9 +, mas o Firefox ainda não suportainnerText
(embora eles tenham adicionado o IE introduzidoouterHTML
apenas alguns dias atrás).Node.textContent
calço bastante completo em andamento aqui: github.com/usmonster/aight/blob/node-textcontent-shim/js/… (esperamos que em breve seja incluído no aight ).innerText
é / será apoiada no FF a partir de 2016.Se você precisa apenas definir o conteúdo do texto e não recuperar, aqui está uma versão trivial do DOM que você pode usar em qualquer navegador; ele não requer a extensão IE innerText ou a propriedade textContent do DOM Nível 3 principal.
fonte
!==
operador, o inverso de===
. A comparação sensível ao tipo usada por===
/!==
geralmente é preferível aos comparadores frouxos==
/!=
.!==null
completamente o caminho) em vez de apenas substituí-lo porelement.innerHTML=''
(o que é especificado para fazer exatamente o mesmo trabalho que o loop e, então, lembrei-me .. .: tables in (legacy-) IE ... ericvasilik.com/2006/07/code-karma.html Posso sugerir a adição de uma breve descrição do " efeito colateral " oculto e quase nunca documentado dacreateTextNode
substituição de amp lt ? e gt às suas respectivas entidades de caracteres html Um link para seu comportamento exato seria grand!O jQuery fornece um
.text()
método que pode ser usado em qualquer navegador. Por exemplo:fonte
De acordo com a resposta de Prakash K, o Firefox não suporta a propriedade innerText. Portanto, você pode simplesmente testar se o agente do usuário suporta essa propriedade e proceder conforme a seguir:
fonte
Uma linha realmente simples de Javascript pode obter o texto "não taggy" em todos os principais navegadores ...
fonte
textContent
einnerText
relatar espaços em branco que podem ser importantes para alguns casos de uso.||
, ou seja:var myText = (myElement.innerText || myElement.textContent || "") ;
para superar o valor indefinido.Observe que a
Element::innerText
propriedade não conterá o texto oculto pelo estilo CSS "display:none
" no Google Chrome (também eliminará o conteúdo que foi mascarado por outras técnicas de CSS (incluindo tamanho da fonte: 0, cor: transparente e alguns outros efeitos semelhantes que fazem com que o texto não seja renderizado de maneira visível).Outras propriedades CSS também são consideradas:
<br \>
que gera uma nova linha embutida também gerará uma nova linha no valor de innerText.Mas
Element::textContent
ainda conterá TODO o conteúdo dos elementos internos do texto independentemente do CSS aplicado, mesmo que sejam invisíveis. E não serão geradas novas linhas ou espaços em branco extras no textContent, que apenas ignora todos os estilos e a estrutura e os tipos de elementos internos embutidos / bloqueados ou posicionados.Uma operação de copiar / colar usando a seleção do mouse descartará o texto oculto no formato de texto sem formatação colocado na área de transferência, para que não contenha tudo o
textContent
que estiver dentro, mas apenas o que está dentroinnerText
(após a geração de espaços em branco / nova linha, como acima) .Ambas as propriedades são suportadas no Google Chrome, mas seu conteúdo pode ser diferente. Os navegadores mais antigos ainda incluídos no innetText, como tudo o que o conteúdo do conteúdo agora contém (mas o comportamento deles em relação à geração de espaços em branco / novas linhas era inconsistente).
O jQuery resolverá essas inconsistências entre navegadores usando o método ".text ()" adicionado aos elementos analisados que ele retorna por meio de uma consulta $ (). Internamente, ele resolve as dificuldades examinando o HTML DOM, trabalhando apenas com o nível "nó". Portanto, ele retornará algo parecido com o textContent padrão.
A ressalva é que esse método jQuery não inserirá espaços extras ou quebras de linha que possam ser visíveis na tela causadas por subelementos (como
<br />
) do conteúdo.Se você projetar alguns scripts para acessibilidade e sua folha de estilo for analisada para renderização não auditiva, como plug-ins usados para se comunicar com um leitor de Braille, essa ferramenta deverá usar o textContent se precisar incluir os sinais de pontuação específicos adicionados em vãos estilizados com "display: none" e que geralmente são incluídos nas páginas (por exemplo, sobrescritos / subscritos); caso contrário, o innerText será muito confuso para o leitor de Braille.
Os textos ocultos pelos truques de CSS agora são normalmente ignorados pelos principais mecanismos de pesquisa (que também analisam o CSS de suas páginas HTML e também ignoram textos que não estão com cores contrastantes no fundo) usando um analisador de HTML / CSS e a propriedade DOM "innerText" exatamente como nos navegadores visuais modernos (pelo menos esse conteúdo invisível não será indexado, portanto, o texto oculto não pode ser usado como um truque para forçar a inclusão de algumas palavras-chave na página para verificar seu conteúdo); mas esse texto oculto ainda será exibido na página de resultados (se a página ainda estiver qualificada no índice para ser incluída nos resultados), usando a propriedade "textContent" em vez do HTML completo para remover os estilos e scripts extras.
Se você atribuir texto sem formatação em qualquer uma dessas duas propriedades, isso substituirá a marcação interna e os estilos aplicados a ela (apenas o elemento atribuído manterá seu tipo, atributos e estilos), portanto, ambas as propriedades conterão o mesmo conteúdo . No entanto, alguns navegadores agora não respeitam mais a gravação em innerText e permitem sobrescrever a propriedade textContent (você não pode inserir a marcação HTML ao gravar nessas propriedades, pois os caracteres especiais HTML serão codificados corretamente usando referências de caracteres numéricos para aparecer literalmente , se você ler a
innerHTML
propriedade após a atribuição deinnerText
outextContent
.fonte
innerText
. Nos meus testes, apenas "display: none" e "visible: hidden" são ignorados.Editar (obrigado a Mark Amery pelo comentário abaixo): Faça isso desta maneira apenas se souber, sem sombra de dúvida, que nenhum código dependerá da verificação da existência dessas propriedades, como (por exemplo) o jQuery . Mas se você estiver usando jQuery, provavelmente usaria a função "text" e executaria $ ('# myElement'). Text ('foo'), como mostram outras respostas.
fonte
innerText
outextContent
para decidir qual usar. Ao definir ambos como uma sequência, você fará com que o código de outras pessoas que atua no elemento detecte por engano que o navegador suporta as duas propriedades; consequentemente, esse código pode se comportar mal.innerText
foi adicionado ao Firefox e deve estar disponível na versão FF45: https://bugzilla.mozilla.org/show_bug.cgi?id=264412Um rascunho de especificação foi escrito e espera-se que seja incorporado ao padrão de vida em HTML no futuro: http://rocallahan.github.io/innerText-spec/ , https://github.com/whatwg/html/issues/ 465
Observe que atualmente as implementações do Firefox, Chrome e IE são todas incompatíveis. No futuro, provavelmente podemos esperar que o Firefox, Chrome e Edge convergam enquanto o IE antigo permanece incompatível.
Veja também: https://github.com/whatwg/compat/issues/5
fonte
innerText
. SetextContent
for um fallback aceitável e você precisar oferecer suporte ao FX antigo, use(innerText || textContent)
. Se você deseja uma implementação idêntica em todos os navegadores, não acredito que exista um polyfill específico para isso, mas algumas estruturas (por exemplo, jQuery) podem já implementar algo semelhante - consulte as outras respostas nesta página.innerText
, isto é: o texto visível em uma página, no Firefox> = 38 (para um complemento) Pelo menos, as<script>
tags devem ser completamente omitidas. O jQuery$('#body').text()
não funcionou para mim. Mas, como solução alternativa,innerText || textContent
tudo bem. Obrigado.textContent
por enquanto.Que tal algo assim?
** Eu precisava fazer a minha maiúscula.
fonte
Como em 2016, no Firefox v45,
innerText
funciona no firefox, dê uma olhada no suporte: http://caniuse.com/#search=innerTextSe você deseja que ele funcione nas versões anteriores do Firefox, você pode usá-lo
textContent
, que tem melhor suporte no Firefox, mas pior nas versões mais antigas do IE : http://caniuse.com/#search=textContentfonte
Esta tem sido a minha experiência com
innerText
,textContent
,innerHTML
, e valor:ie = internet explorer, ff = firefox, ch = google chrome. nota 1: ff funciona até que o valor seja excluído com backspace - veja nota de Ray Vega acima. nota 2: funciona um pouco no chrome - após a atualização, ele permanece inalterado e você clica para fora e clica novamente no campo e o valor aparece. O melhor do lote é
elem.value = changeVal
; que não comentei acima.fonte
Apenas republicando comentários sob a postagem original. innerHTML funciona em todos os navegadores. Obrigado stefita.
myElement.innerHTML = "foo";
fonte
innerHTML
não é um substituto adequado paratextContent
/ ainnerText
menos que você tenha certeza de que o texto que você está atribuindo não contém nenhuma tag ou outra sintaxe HTML. Para quaisquer dados fornecidos pelo usuário, você definitivamente não tem essa garantia. Empurrar essa abordagem sem essa ressalva é perigoso, pois pode levar a falhas de segurança do XSS . Com tantas abordagens seguras disponíveis, não há razão para considerar essa..innerHTML
, seu código será quebrado e você estará potencialmente vulnerável ao XSS. O que acontece se essa string for"<script>alert(1)</script>"
?<script>
tag inserida viainnerHTML
não deve ser executada. Mas isso não protege navegadores antigos. Além disso, o HTML5innerHTML
NÃO salvaguardaria, por exemplo"<img src='x' onerror='alert(1)'>"
.encontrou isso aqui:
fonte
textContent
nativo ? Também vale a pena notar que, uma vez queinnerText
etextContent
com comportamentos diferentes, o código acima não é umtextContent
calço fiel - isso é potencialmente importante, mas não necessariamente óbvio!Também é possível emular o
innerText
comportamento em outros navegadores:fonte
pre
s, pois duplicará as novas linhas. Eu suspeito que há mais errado aqui.