Como obter o texto puro sem o elemento HTML usando JavaScript?

122

Eu tenho o botão 1 e algum texto no meu HTML, como o seguinte:

function get_content(){
   // I don't know how to do in here!!!
}

<input type="button" onclick="get_content()" value="Get Content"/>
<p id='txt'>
<span class="A">I am</span>
<span class="B">working in </span>
<span class="C">ABC company.</span>
</p>

Quando o usuário clicar no botão, o conteúdo no <p id='txt'>se tornará o seguinte resultado esperado:

<p id='txt'>
// All the HTML element within the <p> will be disappear
I am working in ABC company.
</p>

Alguém pode me ajudar a escrever a função JavaScript?

Obrigado.

John
fonte
Isso responde sua pergunta? Tira o HTML do JavaScript de texto
KyleMit

Respostas:

73

[25/07/2017] Como essa continua sendo a resposta aceita, apesar de ser uma solução muito hacky, estou incorporando o código de Gabi nele, deixando o meu próprio para servir como um mau exemplo.

<style>
.A {background: blue;}
.B {font-style: italic;}
.C {font-weight: bold;}
</style>

<script>
// my hacky approach:
function get_content() {
     var html = document.getElementById("txt").innerHTML;
     document.getElementById("txt").innerHTML = html.replace(/<[^>]*>/g, "");
}
// Gabi's elegant approach, but eliminating one unnecessary line of code:
function gabi_content() {
    var element = document.getElementById('txt');
    element.innerHTML = element.innerText || element.textContent;
}
// and exploiting the fact that IDs pollute the window namespace:
function txt_content() {
    txt.innerHTML = txt.innerText || txt.textContent;
}
</script>

<input type="button" onclick="get_content()" value="Get Content (bad)"/>
<input type="button" onclick="gabi_content()" value="Get Content (good)"/>
<input type="button" onclick="txt_content()" value="Get Content (shortest)"/>
<p id='txt'>
<span class="A">I am</span>
<span class="B">working in </span>
<span class="C">ABC company.</span>
</p>
jcomeau_ictx
fonte
3
Ruim porque hacky e lento. Existe mesmo uma garantia de que o próprio texto renderizado nunca deve conter tags?
Domi
1
não, não existe essa garantia. Eu dei um aviso quando publiquei. aparentemente, serviu ao propósito do OP.
jcomeau_ictx
3
Tentar analisar HTML com expressões regulares é realmente perigoso - é praticamente impossível (suspeito que possa ser teoricamente impossível) acertar. Existem muitos casos extremos e, em seguida, seu código explode diante de entradas estranhas, que podem ser exploradas com freqüência para fazer XSS.
David Given
2
meu palpite sobre o motivo pelo qual foi aceito: é uma resposta completa, que pode ser imediatamente recortada e colada em um arquivo html e testada em um navegador. Eu nunca disse que era uma boa resposta. Postei depois de ver todas as boas respostas que estavam lá e não foram aceitas, e imaginei que o OP precisava de um pouco de mão. ainda é bom o suficiente para qualquer aplicativo cuja fonte HTML já seja conhecida por não conter colchetes angulares desequilibrados.
precisa saber é o seguinte
211

Você pode usar isto:

var element = document.getElementById('txt');
var text = element.innerText || element.textContent;
element.innerHTML = text;

Dependendo do que você precisa, você pode usar element.innerTextou element.textContent. Eles diferem de várias maneiras. innerTexttenta aproximar o que aconteceria se você selecionasse o que vê (html renderizado) e copiasse para a área de transferência, enquanto textContentmeio que apenas tira as tags html e fornece o que resta.

innerText também tem compatibilidade com navegadores IE antigos (veio de lá).

Gabi Purcaru
fonte
3
+1 - Estava procurando algum textmétodo de alto desempenho , já que é feito muito em um loop. O jQuery não teve desempenho suficiente, mas isso foi muito rápido. Trabalhou no IE8 +, chrome, ff. Perfeito.
Travis J
2
No IE antigo, el.textContentserá undefinede el.innerTextpoderá ser "". Mas "" || undefinedé undefined. Usar el.innerText || el.textContent || ''pode ser melhor.
Oriol
3
innerText não retorna texto oculto e conteúdo de tags de script / estilo, enquanto textContent retorna. Se você estiver em uma versão do IE compatível com textContent, talvez seja preferível usá-lo primeiro el.textContent || el.innerText || "".
Domino
2
Apenas uma observação para qualquer pessoa que esteja lendo esta resposta nos dias atuais, mais de seis anos após essa resposta, nos dias de hoje você pode simplesmente usar var text = element.textContent;; a menos que, por algum motivo ímpio, você ainda precise oferecer suporte ao IE8 ou abaixo .
Código inútil
el.innerTexté aproximadamente o mesmo que el.textContent.replace(/\W+/g, ' '). Eles não são os mesmos.
Poli
26

Se você pode usar o jquery, é simples

$("#txt").text()
Sarath
fonte
8
Eu só tenho que dizer, veja todas as respostas JS puras e depois veja essa. Essa é a segunda razão mais importante pela qual eu uso o jQuery (ou seja, simplifica tarefas, reduz minha carga de trabalho e aumenta a legibilidade). O primeiro motivo mais importante (para mim) é porque ele lida com muitos problemas de compatibilidade cruzada, dos quais talvez eu nem saiba (como usar o jQuery para ajustar a opacidade, para que não precise escrever uma linha separada apenas para o IE8 para direcionar a filterpropriedade sei que pura JS é tecnicamente mais eficiente quando se trata de velocidade, mas isso pouco importa mais em mais normal ...
VoidKing
8
pure js one liner equivalente: document.querySelector("#txt").innerText;As pessoas incluem toda a biblioteca jQuery com muita freqüência quando sua única necessidade é de algumas linhas de código. É uma prática ruim.
Levi Johansen
10

Esta resposta funcionará para obter apenas o texto para qualquer elemento HTML.

Este primeiro parâmetro "nó" é o elemento para o qual obter o texto. O segundo parâmetro é opcional e, se verdadeiro, adicionará um espaço entre o texto nos elementos, caso não exista espaço nele.

function getTextFromNode(node, addSpaces) {
    var i, result, text, child;
    result = '';
    for (i = 0; i < node.childNodes.length; i++) {
        child = node.childNodes[i];
        text = null;
        if (child.nodeType === 1) {
            text = getTextFromNode(child, addSpaces);
        } else if (child.nodeType === 3) {
            text = child.nodeValue;
        }
        if (text) {
            if (addSpaces && /\S$/.test(result) && /^\S/.test(text)) text = ' ' + text;
            result += text;
        }
    }
    return result;
}
James
fonte
2

Dependendo do que você precisa, você pode usar element.innerTextou element.textContent. Eles diferem de várias maneiras. innerTexttenta aproximar o que aconteceria se você selecionasse o que vê (html renderizado) e copiasse para a área de transferência, enquanto textContentmeio que apenas tira as tags html e fornece o que resta.

innerText não é mais usado apenas para o IE e é suportado em todos os principais navegadores . Claro que, ao contráriotextContent , ele é compatível com navegadores IE antigos (desde que eles vieram com ele).

Exemplo completo ( da resposta de Gabi ):

var element = document.getElementById('txt');
var text = element.innerText || element.textContent; // or element.textContent || element.innerText
element.innerHTML = text;
Matthias
fonte
2

Isso funciona para mim compilado com base no que foi dito aqui com um padrão mais moderno. Isso funciona melhor para várias pesquisas.

let element = document.querySelectorAll('.myClass')
  element.forEach(item => {
    console.log(item.innerHTML = item.innerText || item.textContent)
  })
Issac Gable
fonte
1

Isso deve funcionar:

function get_content(){
   var p = document.getElementById("txt");
   var spans = p.getElementsByTagName("span");
   var text = '';
   for (var i = 0; i < spans.length; i++){
       text += spans[i].innerHTML;
   }

   p.innerHTML = text;
}

Experimente este violino: http://jsfiddle.net/7gnyc/2/

Igor Dymov
fonte
1
function get_content(){
 var returnInnerHTML = document.getElementById('A').innerHTML + document.getElementById('B').innerHTML + document.getElementById('A').innerHTML;
 document.getElementById('txt').innerHTML = returnInnerHTML;
}

Isso deve resolver.


fonte
0

Experimente (versão curta da idéia de resposta de Gabi )

function get_content() {
   txt.innerHTML = txt.textContent;
}

Kamil Kiełczewski
fonte