提问人:J K 提问时间:2/5/2016 最后编辑:u-waysJ K 更新时间:11/30/2022 访问量:163455
textContent 与 innerText 之间的区别
Difference between textContent vs innerText
问:
JavaScript 和 有什么区别?textContent
innerText
我可以使用以下方法吗:textContent
var logo$ = document.getElementsByClassName('logo')[0];
logo$.textContent = "Example";
答:
大多数浏览器都支持 textContent。ie8 或更早版本不支持它,但可以使用 polyfill
textContent 属性设置或返回指定节点的文本内容及其所有后代。
查看 http://www.w3schools.com/jsref/prop_node_textcontent.asp
从2016年开始,innerText
和textContent
都是标准化的。所有对象(包括纯文本节点)都有 ,但只有对象有 。Node
textContent
HTMLElement
innerText
虽然适用于大多数浏览器,但它不适用于 IE8 或更早版本。使用此 polyfill 使其仅在 IE8 上工作。此 polyfill 不适用于 IE7 或更早版本。textContent
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);
}
}
);
})();
}
该方法在 IE9 或更高版本中可用,但在 IE8 中仅适用于 DOM 对象。Object.defineProperty
https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent
评论
innerText
Object.defineProperty()
Kelly Norton 的博文很好地概述了 和 之间的主要区别:innerText 与 textContent。您可以在下面找到摘要:innerText
textContent
innerText
是非标准的,是较早标准化的。textContent
innerText
返回节点中包含的可见文本,同时返回全文。例如,在以下 HTML 中,将返回 'Hello',而 将返回 'Hello World'。有关更完整的差异列表,请参阅 http://perfectionkills.com/the-poor-misunderstood-innerText/ 中的表格(进一步阅读“innerText”在IE中有效,但在Firefox中无效)。textContent
<span>Hello <span style="display: none;">World</span></span>
innerText
textContent
- 因此,它对性能的要求要高得多:它需要布局信息来返回结果。
innerText
innerText
仅针对对象定义,而textContent
针对所有对象定义。HTMLElement
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;
}
评论
innerText
<br>
textContent
<br>
textContent
elem.textContent = 'foobar'
elem.innerText = 'foobar'
innerText
textContent
text-transform
textContent
innerText
<div style="text-transform: uppercase;">Hello World</div>
textContent
let allElements = [...document.getElementsByTagName('*')]; t1 = performance.now(); for(let i=0; i<allElements.length; i++){ txt = allElements[i].innerText; } t2 = performance.now(); console.log('innerText', t2-t1); for(let i=0; i<allElements.length; i++){ txt = allElements[i].textContent; } t3 = performance.now(); console.log('textContent', t3-t2);
innerText
textContent
textContent
<script>
style="display: none;"
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>
评论
textContent
返回全文,不关心可见性,而确实如此。innerText
<p id="source">
<style>#source { color: red; }</style>
Text with breaking<br>point.
<span style="display:none">HIDDEN TEXT</span>
</p>
输出:textContent
#source { color: red; } Text with breakingpoint. HIDDEN TEXT
输出 ( 注意 如何 知道 标签 ,并忽略隐藏元素 ):innerText
innerText
<br>
Text with breaking point.
评论
innerHTML 甚至会执行 HTML 标签,这可能会造成任何类型的客户端注入攻击,例如基于 DOM 的 XSS。 下面是代码片段:
<!DOCTYPE html>
<html>
<body>
<script>
var source = "Hello " + decodeURIComponent("<h1>Text inside gets executed as h1 tag HTML is evaluated</h1>"); //Source
var divElement = document.createElement("div");
divElement.innerHTML = source; //Sink
document.body.appendChild(divElement);
</script>
</body>
</html>
如果使用 .textContent,则不会计算 HTML 标记并将其打印为 String。
<!DOCTYPE html>
<html>
<body>
<script>
var source = "Hello " + decodeURIComponent("<h1>Text inside will not get executed as HTML</h1>"); //Source
var divElement = document.createElement("div");
divElement.textContent = source; //Sink
document.body.appendChild(divElement);
</script>
</body>
</html>
编号: https://www.scip.ch/en/?labs.20171214
评论
innerHTML
innerText
除了其他答案中提到的所有差异之外,这是我最近才发现的另一个差异:
尽管据说该属性自 2016 年以来已经标准化,但它在浏览器之间表现出差异:Mozilla 忽略了 U+200E 和 U+200F 字符(“lrm”和“rlm”),而 Chrome 则没有。innerText
innerText
console.log(document.getElementById('test').textContent.length);
console.log(document.getElementById('test').innerText.length);
<div id="test">[‎]</div>
Firefox 报告 3 和 2,Chrome 报告 3 和 3。
还不确定这是一个错误(如果是这样,在哪个浏览器中)还是只是我们必须忍受的那些古怪的不兼容问题之一。
评论
与此相比的另一个有用行为是换行符和彼此相邻的多个空格将仅显示为一个空格,这样可以更容易地比较字符串。innerText
textContent
但取决于你想要什么,可能就足够了。firstChild.nodeValue
document.querySelector('h1').innerText/innerHTML/textContent
.querySelector('h1').innerText
- 给我们里面的文字。它对当前显示的内容或隐藏的员工敏感,将被忽略。
.querySelector('h1').textContent
- 就像,但它不关心正在显示的内容或实际向用户显示的内容。它将显示所有内容。innerText
.querySelector('h1').innerHTML
= <i>sdsd</i>
将起作用* - 检索完整内容,包括标记名称。
评论
innerText
并且绝对不一样。节点内容中出现的空格将导致这两个属性产生不同的内容,元素和其他块级呈现的后代的出现也是如此。textContent
br