Diferencia entre innerText y innerHTML


256

¿Cuál es la diferencia entre innerHTML, innerTexty childNodes[].valueen JavaScript?


44
@tymeJV Honestamente, la distinción con innerTextuna implementación no estándar de textContext por MSIE no es trivial.
fny

44
Además de innerText que no funciona en Firefox: textContent parece funcionar en todos los principales navegadores, así que solo use textContent en lugar de innerText.
auco

55
NOTA IMPORTANTE: Los 3 comentarios anteriores ya no son válidos. innerTextse ha agregado a los estándares y es compatible con todos los principales navegadores. textContentahora es compatible con IE> = 9 y se puede usar en lugar de innerTexten la mayoría de los casos (bonificación, es mucho más rápido), pero hay diferencias entre los dos, por lo que en algunos casos no puede intercambiarlos.
Racil Hilan

3
Actualización 2019: innerTextes compatible con todos los navegadores. Firefox comenzó a admitirlo
Aditya Gupta

Me sorprende que la seguridad no se aborde aquí. innerHTML es una vulnerabilidad conocida para los ataques XSS. Dicho esto, innerTexttampoco es 100% seguro. stackoverflow.com/questions/52707031/does-innertext-prevent-xss blog.cloudboost.io/…
davidhartman00

Respuestas:


147

Sin innerTextembargo, a diferencia , le innerHTMLpermite trabajar con texto enriquecido HTML y no codifica y decodifica automáticamente el texto. En otras palabras, innerTextrecupera y establece el contenido de la etiqueta como texto sin formato, mientras que innerHTMLrecupera y establece el contenido en formato HTML.


77
Muy importante para pegar aquí en el comentario de respuesta aceptado @ jor a continuación en otra respuesta: "Solo por claridad: esto solo se aplica al CONFIGURAR un valor. Cuando OBTENGA el valor, las etiquetas HTML simplemente se eliminan y se obtiene el texto sin formato".
Heitor

261

Los siguientes ejemplos se refieren al siguiente fragmento de HTML:

<div id="test">
   Warning: This element contains <code>code</code> and <strong>strong language</strong>.
</div>

El nodo será referenciado por el siguiente JavaScript:

var x = document.getElementById('test');


element.innerHTML

Establece u obtiene la sintaxis HTML que describe los descendientes del elemento.

x.innerHTML
// => "
// =>   Warning: This element contains <code>code</code> and <strong>strong language</strong>.
// => "

Esto es parte de la Especificación de análisis y serialización DOM del W3C . Tenga en cuenta que es una propiedad de los Elementobjetos.


node.innerText

Establece u obtiene el texto entre las etiquetas de inicio y fin del objeto

x.innerText
// => "Warning: This element contains code and strong language."
  • innerTextfue presentado por Microsoft y no fue compatible por un tiempo con Firefox. En agosto de 2016, innerTextfue adoptado por el WHATWG y se agregó a Firefox en v45.
  • innerText le ofrece una representación del texto que tiene en cuenta el estilo que intenta coincidir con lo que representa el navegador, esto significa:
    • innerTextaplica text-transformy white-spacegobierna
    • innerText recorta el espacio en blanco entre líneas y agrega saltos de línea entre elementos
    • innerText no devolverá texto para elementos invisibles
  • innerTextregresará textContentpara elementos que nunca se representan como <style />y `
  • Propiedad de los Nodeelementos


node.textContent

Obtiene o establece el contenido de texto de un nodo y sus descendientes.

x.textContent
// => "
// =>   Warning: This element contains code and strong language.
// => "

Si bien este es un estándar W3C , IE <9 no lo admite.

  • No conoce el estilo y, por lo tanto, devolverá contenido oculto por CSS
  • No desencadena un reflujo (por lo tanto, más eficiente)
  • Propiedad de los Nodeelementos


node.value

Este depende del elemento al que te hayas dirigido. Para el ejemplo anterior, xdevuelve un objeto HTMLDivElement , que no tiene una valuepropiedad definida.

x.value // => null

Las etiquetas de entrada ( <input />), por ejemplo, definen una valuepropiedad , que se refiere al "valor actual en el control".

<input id="example-input" type="text" value="default" />
<script>
  document.getElementById('example-input').value //=> "default"
  // User changes input to "something"
  document.getElementById('example-input').value //=> "something"
</script>

De los documentos :

Nota: para ciertos tipos de entrada, el valor devuelto puede no coincidir con el valor que el usuario ha ingresado. Por ejemplo, si el usuario ingresa un valor no numérico en un <input type="number">, el valor devuelto podría ser una cadena vacía.


Script de muestra

Aquí hay un ejemplo que muestra el resultado del HTML presentado anteriormente:

var properties = ['innerHTML', 'innerText', 'textContent', 'value'];

// Writes to textarea#output and console
function log(obj) {
  console.log(obj);
  var currValue = document.getElementById('output').value;
  document.getElementById('output').value = (currValue ? currValue + '\n' : '') + obj; 
}

// Logs property as [propName]value[/propertyName]
function logProperty(obj, property) {
  var value = obj[property];
  log('[' + property + ']'  +  value + '[/' + property + ']');
}

// Main
log('=============== ' + properties.join(' ') + ' ===============');
for (var i = 0; i < properties.length; i++) {
  logProperty(document.getElementById('test'), properties[i]);
}
<div id="test">
  Warning: This element contains <code>code</code> and <strong>strong language</strong>.
</div>
<textarea id="output" rows="12" cols="80" style="font-family: monospace;"></textarea>


1
Incluso las versiones más recientes de Firefox no son compatibles innerText: quirksmode.org/dom/html y quirksmode.org/dom/tests/innerhtml.html
Jarno Lamberg

Sería útil tener cada una de las cuatro propiedades (innerHTML, innerText, textContent, value) divididas en dos subtítulos: comportamiento "get" y comportamiento "set".
Luke Hutchison

3
De acuerdo con developer.mozilla.org/en-US/docs/Web/API/Node/innerText Firefox >=45 es compatible.
Kilmazing

44
Si entiendo el MDN correctamente, innerTextahora es parte del Estándar y debería ser compatible con Firefox desde la versión 45 en adelante; tal vez razón para una actualización de esta gran respuesta @faraz
domsson

1
También se convierte &lt;a <, &gt;a >, etc.
SarcasticSully

23

InnerTextLa propiedad html-codifica el contenido, pasando <p>a &lt;p&gt;, etc. Si desea insertar etiquetas HTML, debe usarlas InnerHTML.


8
Solo por claridad: esto solo se aplica al CONFIGURAR un valor. Cuando OBTENGA el valor, las etiquetas HTML simplemente se eliminan y obtiene el texto sin formato.
jor

9

En palabras simples:

  1. innerTextmostrará el valor tal como está e ignora cualquier HTMLformato que se pueda incluir.
  2. innerHTMLmostrará el valor y aplicará cualquier HTMLformato.

3
var element = document.getElementById("main");
var values = element.childNodes[1].innerText;
alert('the value is:' + values);

Para refinarlo aún más y recuperar el valor Alec, por ejemplo, use otro .childNodes [1]

var element = document.getElementById("main");
var values = element.childNodes[1].childNodes[1].innerText;
alert('the value is:' + values);

2

En términos de MutationObservers, la configuración innerHTMLgenera una childListmutación debido a que los navegadores eliminan el nodo y luego agregan un nuevo nodo con el valor de innerHTML.

Si configura innerText, characterDatase genera una mutación.


2

La única diferencia entre innerTexty innerHTMLes que innerTextinserta una cadena tal como está en el elemento, mientras la innerHTMLejecuta como contenido html.

const ourstring = 'My name is <b class="name">Satish chandra Gupta</b>.';
document.getElementById('innertext').innerText = ourstring;
document.getElementById('innerhtml').innerHTML = ourstring;
.name{
color:red;
}
<h3>Inner text below. It inject string as it is into the element.</h3>
<div id="innertext"></div>
<br />
<h3>Inner html below. It renders the string into the element and treat as part of html document.</h3>
<div id="innerhtml"></div>


1

InnerTextsolo devolverá el valor de texto de la página con cada elemento en una nueva línea en texto sin formato, mientras innerHTMLque devolverá el contenido HTML de todo dentro de la bodyetiqueta y childNodesdevolverá una lista de nodos, como sugiere su nombre.


1

La innerTextpropiedad devuelve el valor de texto real de un elemento html mientras que el innerHTMLdevuelve el HTML content. Ejemplo a continuación:

var element = document.getElementById('hello');
element.innerText = '<strong> hello world </strong>';
console.log('The innerText property will not parse the html tags as html tags but as normal text:\n' + element.innerText);

console.log('The innerHTML element property will encode the html tags found inside the text of the element:\n' + element.innerHTML);
element.innerHTML = '<strong> hello world </strong>';
console.log('The <strong> tag we put above has been parsed using the innerHTML property so the .innerText will not show them \n ' + element.innerText);
console.log(element.innerHTML);
<p id="hello"> Hello world 
</p>


0

para agregar a la lista, innerText mantendrá su transformación de texto, innerHTML no

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.