JavaScript 中textContent
和之间有什么区别innerText
?
我可以使用textContent
如下:
var logo$ = document.getElementsByClassName('logo')[0];
logo$.textContent = "Example";
JavaScript 中textContent
和之间有什么区别innerText
?
我可以使用textContent
如下:
var logo$ = document.getElementsByClassName('logo')[0];
logo$.textContent = "Example";
Kelly Norton 的博文:innerText 与 textContent 中很好地概述了innerText
和之间的主要区别。您可以在下面找到摘要:textContent
innerText
是非标准的,textContent
更早被标准化了。innerText
返回可见包含在一个节点的文本,而textContent
返回完整文本。例如,在下面的 HTML 中<span>Hello <span style="display: none;">World</span></span>
,innerText
将返回 'Hello',而textContent
将返回 'Hello World'。如需更完整的差异列表,请参阅http://perfectkills.com/the-poor-misunderstood-innerText/ 上的表格(进一步阅读“innerText”在 IE 中有效,但在 Firefox 中无效)。innerText
性能更高:它需要布局信息来返回结果。innerText
仅针对HTMLElement
对象定义,而textContent
针对所有Node
对象定义。请务必查看此答案下方的信息丰富的评论。
textContent
在 IE8- 中不可用,并且裸机 polyfill 看起来像是nodeValue
在所有childNodes
指定节点上使用的递归函数:
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;
}
textContent
是唯一可用于文本节点的:
var text = document.createTextNode('text');
console.log(text.innerText); // undefined
console.log(text.textContent); // text
在元素节点中,innerText
评估 <br> 元素,同时textContent
评估控制字符:
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
给出:
1
2
3
4 5 6 7 8
span.textContent
给出:
1234
5
6
7
8
textContent
如果内容是用 设置的,则带有控制字符(例如换行符)的字符串不可用innerText
。另一种方式(用 设置控制字符textContent
),所有字符都用innerText
和返回textContent
:
var div = document.createElement('div');
div.innerText = "x\ny";
console.log(div.textContent); // xy
对于那些用谷歌搜索这个问题并到达这里的人。我觉得这个问题最明确的答案是在 MDN 文档中:https : //developer.mozilla.org/en-US/docs/Web/API/Node/textContent。
您可以忘记所有可能使您感到困惑的要点,但请记住两件事:
textContent
通常是您要查找的属性。innerText
如果用户使用光标突出显示该元素的内容,然后将其复制到剪贴板,则该文本近似于用户将获得的文本。并textContent
为您提供可见或隐藏的一切,包括<script>
和<style>
元素。两个innerText
&textContent
都在 2016 年标准化。所有Node
对象(包括纯文本节点)都有textContent
,但只有HTMLElement
对象有innerText
。
虽然textContent
适用于大多数浏览器,但它不适用于 IE8 或更早版本。使用这个 polyfill 让它只在 IE8 上工作。此 polyfill 不适用于 IE7 或更早版本。
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);
}
}
);
})();
}
该Object.defineProperty
方法在 IE9 或更高版本中可用,但在 IE8 中仅适用于 DOM 对象。
https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent
大多数浏览器都支持 textContent。ie8 或更早版本不支持,但可以使用 polyfill
textContent 属性设置或返回指定节点及其所有后代的文本内容。