¿Cómo obtener el texto puro sin elemento HTML usando JavaScript?

122

Tengo el botón 1 y algo de texto en mi HTML como el siguiente:

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>

Cuando el usuario hace clic en el botón, el contenido <p id='txt'>se convertirá en el siguiente resultado esperado:

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

¿Alguien puede ayudarme a escribir la función de JavaScript?

Gracias.

Juan
fuente
¿Responde esto a tu pregunta?
Eliminar

Respuestas:

73

[2017-07-25] ya que esta sigue siendo la respuesta aceptada, a pesar de ser una solución muy hacky, estoy incorporando el código de Gabi , dejando el mío como un mal ejemplo.

<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
fuente
3
Malo porque hacky y lento. ¿Existe incluso una garantía de que el texto renderizado nunca debe contener etiquetas?
Domi
1
No, no existe tal garantía. Di un descargo de responsabilidad cuando publiqué. aparentemente sirvió para el propósito del OP.
jcomeau_ictx
3
Intentar analizar HTML con expresiones regulares es realmente peligroso --- es prácticamente imposible (sospecho que puede ser teóricamente imposible) hacerlo bien. Hay demasiados casos extremos y luego su código explota cuando se enfrenta a una entrada extraña, que con frecuencia se puede explotar para hacer XSS.
David dado
2
Supongo por qué se aceptó: es una respuesta completa, que se puede cortar y pegar inmediatamente como está en un archivo html y probar con un navegador. Nunca dije que fuera una buena respuesta. Publiqué después de ver que todas las buenas respuestas estaban allí, y no las acepté, y pensé que el OP necesitaba un poco de control. sigue siendo lo suficientemente bueno para cualquier aplicación para la que ya se sabe que la fuente HTML no contiene corchetes angulares desequilibrados.
jcomeau_ictx
211

Puedes usar esto:

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

Dependiendo de lo que necesite, puede usar cualquiera element.innerTexto element.textContent. Se diferencian de muchas maneras. innerTextintenta aproximar lo que sucedería si selecciona lo que ve (renderizado html) y lo copia al portapapeles, mientrastextContent simplemente elimina las etiquetas html y le da lo que queda.

innerText También tiene compatibilidad con los antiguos navegadores IE (vinieron de allí).

Gabi Purcaru
fuente
3
+1: estaba buscando algún textmétodo de alto rendimiento ya que se hace mucho en un bucle. jQuery no tuvo el rendimiento suficiente, pero esto fue muy rápido. Trabajó en IE8 +, cromo, ff. Perfecto.
Travis J
2
En IE antiguo, el.textContentserá undefinedy el.innerTextpodría ser "". Pero "" || undefinedes undefined. Usar el.innerText || el.textContent || ''puede ser mejor.
Oriol
3
innerText no devuelve el texto oculto y el contenido de las etiquetas de script / estilo mientras que textContent sí. Si está en una versión de IE que admite textContent, podría ser preferible usarlo primero, entonces el.textContent || el.innerText || "".
Domino
2
Solo una nota para cualquiera que lea esta respuesta en la actualidad, más de seis años después de esta respuesta, en estos días puede usarla var text = element.textContent;; a menos que por alguna razón impía todavía tengas que soportar IE8 o menos .
Código inútil
el.innerTextes más o menos lo mismo que el.textContent.replace(/\W+/g, ' '). Ellos no son los mismos.
Polv
26

Si puedes usar jquery, entonces es simple

$("#txt").text()
Sarath
fuente
8
Solo tengo que decir, mira todas las respuestas JS puras y luego mira esta. Esta es la segunda razón más importante por la que uso jQuery (es decir, simplifica las tareas, reduce mi carga de trabajo y aumenta la legibilidad). La primera razón más importante (para mí) es porque maneja muchos problemas de compatibilidad cruzada, de lo contrario podría no estar al tanto (como usar jQuery para ajustar la opacidad, de modo que no tenga que escribir una línea separada solo para IE8 para orientar la filterpropiedad sé que pura JS es técnicamente más eficiente cuando se trata de velocidad, pero eso no importa ya en la mayor parte .. normal.
VoidKing
8
Equivalente de js one liner puro: las document.querySelector("#txt").innerText;personas incluyen toda la biblioteca jQuery con demasiada frecuencia cuando su única necesidad es un par de líneas de código. Es una mala practica.
Levi Johansen
10

Esta respuesta funcionará para obtener solo el texto de cualquier elemento HTML.

Este primer parámetro "nodo" es el elemento para obtener el texto. El segundo parámetro es opcional y, si es verdadero, agregará un espacio entre el texto dentro de los elementos si no hubiera espacio allí.

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
fuente
2

Dependiendo de lo que necesite, puede usar cualquiera element.innerTexto element.textContent. Se diferencian de muchas maneras. innerTextintenta aproximar lo que sucedería si selecciona lo que ve (renderizado html) y lo copia al portapapeles, mientrastextContent simplemente elimina las etiquetas html y le da lo que queda.

innerText ya no se usa solo para IE , y es compatible con todos los principales navegadores . Por supuesto, a diferencia detextContent , tiene compatibilidad con los antiguos navegadores IE (ya que se les ocurrió).

Ejemplo completo (de la respuesta de Gabi ):

var element = document.getElementById('txt');
var text = element.innerText || element.textContent; // or element.textContent || element.innerText
element.innerHTML = text;
Matías
fuente
2

Esto funciona para mí compilado en base a lo que se dijo aquí con un estándar más moderno. Esto funciona mejor para múltiples búsquedas.

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

Eso debería 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;
}

Pruebe este violín: http://jsfiddle.net/7gnyc/2/

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

Deberias hacer eso.


fuente
0

Probar (versión corta de la idea de respuesta de Gabi )

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

Kamil Kiełczewski
fuente