Difference between textContent vs innerText
Solution 1:
The key differences between innerText
and textContent
are outlined very well in Kelly Norton's blogpost: innerText vs. textContent. Below you can find a summary:
-
innerText
was non-standard,textContent
was standardized earlier. -
innerText
returns the visible text contained in a node, whiletextContent
returns the full text. For example, on the following HTML<span>Hello <span style="display: none;">World</span></span>
,innerText
will return 'Hello', whiletextContent
will return 'Hello World'. For a more complete list of differences, see the table at http://perfectionkills.com/the-poor-misunderstood-innerText/ (further reading at 'innerText' works in IE, but not in Firefox). - As a result,
innerText
is much more performance-heavy: it requires layout information to return the result. -
innerText
is defined only forHTMLElement
objects, whiletextContent
is defined for allNode
objects.
Be sure to also have a look at the informative comments below this answer.
textContent
was unavailable in IE8-, and a bare-metal polyfill would have looked like a recursive function using nodeValue
on all childNodes
of the specified node:
function textContent(rootNode) {
if ('textContent' in document.createTextNode(''))
return rootNode.textContent;
var childNodes = rootNode.childNodes,
len = childNodes.length,
result = '';
for (var i = 0; i < len; i++) {
if (childNodes[i].nodeType === 3)
result += childNodes[i].nodeValue;
else if (childNodes[i].nodeType === 1)
result += textContent(childNodes[i]);
}
return result;
}
Solution 2:
textContent
is the only one available for text nodes:
var text = document.createTextNode('text');
console.log(text.innerText); // undefined
console.log(text.textContent); // text
In element nodes, innerText
evaluates <br> elements, while textContent
evaluates control characters:
var span = document.querySelector('span');
span.innerHTML = "1<br>2<br>3<br>4\n5\n6\n7\n8";
console.log(span.innerText); // breaks in first half
console.log(span.textContent); // breaks in second half
<span></span>
span.innerText
gives:
1
2
3
4 5 6 7 8
span.textContent
gives:
1234
5
6
7
8
Strings with control characters (e. g. line feeds) are not available with textContent
, if the content was set with innerText
. The other way (set control characters with textContent
), all characters are returned both with innerText
and textContent
:
var div = document.createElement('div');
div.innerText = "x\ny";
console.log(div.textContent); // xy
Solution 3:
For those who googled this question and arrived here. I feel the most clear answer to this question is in MDN document: https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent.
You can forgot all the points that may confuse you but remember 2 things:
- When you are trying to alter the text,
textContent
is usually the property you are looking for. - When you are trying to grab text from some element,
innerText
approximates the text the user would get if they highlighted the contents of the element with the cursor and then copied to the clipboard. AndtextContent
gives you everything, visible or hidden, including<script>
and<style>
elements.
Solution 4:
Both innerText
& textContent
are standardized as of 2016. All Node
objects (including pure text nodes) have textContent
, but only HTMLElement
objects have innerText
.
While textContent
works with most browsers, it does not work on IE8 or earlier. Use this polyfill for it to work on IE8 only. This polyfill will not work with IE7 or earlier.
if (Object.defineProperty
&& Object.getOwnPropertyDescriptor
&& Object.getOwnPropertyDescriptor(Element.prototype, "textContent")
&& !Object.getOwnPropertyDescriptor(Element.prototype, "textContent").get) {
(function() {
var innerText = Object.getOwnPropertyDescriptor(Element.prototype, "innerText");
Object.defineProperty(Element.prototype, "textContent",
{
get: function() {
return innerText.get.call(this);
},
set: function(s) {
return innerText.set.call(this, s);
}
}
);
})();
}
The Object.defineProperty
method is availabe in IE9 or up, however it is available in IE8 for DOM objects only.
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
Solution 5:
textContent is supported by most browsers. It is not supported by ie8 or earlier, but a polyfill can be used for this
The textContent property sets or returns the textual content of the specified node, and all its descendants.
See http://www.w3schools.com/jsref/prop_node_textcontent.asp