textContent与innerText之间的区别

J K*_*J K 119 javascript

textContentinnerTextJavaScript有什么区别?

我可以使用textContent如下:

var logo$ = document.getElementsByClassName('logo')[0];
logo$.textContent = "Example";
Run Code Online (Sandbox Code Playgroud)

Tyb*_*itz 165

其他答案都没有成功提供完整的解释,因此这一点.Kelly Norton的博客文章中很好地概述了innerText和之间的关键差异:innerText与textContent.您可以在下面找到摘要:textContent

  1. innerText是非标准的,而textContent早先是标准化的.
  2. innerText返回可见包含在一个节点的文本,而textContent返回完整文本.例如,在以下HTML上<span>Hello <span style="display: none;">World</span></span>,innerText将返回"Hello",同时textContent将返回"Hello World".有关更完整的差异列表,请参阅http://perfectionkills.com/the-poor-misunderstood-innerText/上的表格.
  3. 因此,innerText性能更高:它需要布局信息才能返回结果.

innerText在IE8中的解决方法将涉及HTMLElement在所有textContent指定节点上使用的递归函数,这里是对polyfill 的尝试:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 另外值得注意的是:`innerText`会将```元素转换为换行符,而`textContent`则会忽略它们.因此,当使用`textContent`时,它们之间只有一个```元素(并且没有空格)的2个单词将被连接起来 (11认同)
  • 那么使用二传手时有什么区别吗?就像`elem.textContent ='foobar'` vs`elem.innerText ='foobar'` (5认同)
  • `innerText` 和 `textContent` 之间行为的另一个区别:如果通过 CSS 更改元素的 `text-transform`,它将影响 'innerText' 的结果,但不会影响 `textContent` 的结果。例如:`&lt;div style="text-transform: uppercase;"&gt;Hello World&lt;/div&gt;`的`innerText`将是“HELLO WORLD”,而“textContent”将是“Hello World”。 (3认同)
  • @ShimonS *innerText 性能更重* 是正确的,但要相对考虑:如果平均上 `innerText` 比 `textContent` 慢 100 倍,并且 `textContent` 每次操作需要 1/1000 毫秒,1 /十分之一毫秒对人类来说仍然“感觉”很快。此外,只有元素包含大量隐藏内容(例如“&lt;script&gt;”或“style="display: none;"”子元素)时,两者之间才有意义的比较 (3认同)

Ric*_*ton 16

不同之处在于它innerText是非标准的并且textContent是标准化的.这是innerText的官方警告.

此功能是非标准功能,不符合标准.不要在面向Web的生产站点上使用它:它不适用于每个用户.实现之间可能存在很大的不兼容性,并且行为可能在将来发生变化.

虽然Node适用于大多数浏览器,但它不适用于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);
       }
     }
   );
  })();
}
Run Code Online (Sandbox Code Playgroud)

textContent方法在ie9或更高版本中可用,但是它仅在ie8中可用于DOM对象.

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

  • 这也是它的规格:https://www.w3.org/TR/DOM-Level-3-Core/core.html也是(很旧的)浏览器支持表(http://www.webdevout.net / browser-support-dom#dom3core)建议,它受IE9 +支持,因此,对于IE8及更高版本,`innerText`是您的朋友。 (2认同)
  • 您为什么不更新答案?https://html.spec.whatwg.org/multipage/dom.html#the-innertext-idl-attribute (2认同)
  • 这是MDN关于innerText的引文-“此功能最初由Internet Explorer引入,并在所有主要浏览器供应商采用后于2016年在HTML标准中正式指定。” (2认同)

Mar*_*tke 13

textContent只在文本节点中可用.

var text = document.createTextNode('text');

console.log(text.innerText);    //  undefined
console.log(text.textContent);  //  text
Run Code Online (Sandbox Code Playgroud)



在元素节点中,innerText评估<br>标签,textContent控制字符.

var span = document.querySelector('span');
span.innerHTML = "1<br>2<br>3<br>4\n5\n6\n7\n8";
Run Code Online (Sandbox Code Playgroud)

span.innerText

1
2
3
4 5 6 7 8

span.textContent

1234
5
6
7
8


如果内容是使用innerText设置的,则带有控制字符的字符串(例如换行符)不适用于textContent.另一种方式(使用textContent设置控制字符),所有字符都返回innerText和textContent.

var div = document.createElement('div');

div.innerText = "x\ny";
console.log(div.textContent);  //  xy
Run Code Online (Sandbox Code Playgroud)


Jer*_*own 11

大多数浏览器都支持textContent.ie8或更早版本不支持它,但可以使用polyfill

textContent属性设置或返回指定节点及其所有后代的文本内容.

请参见http://www.w3schools.com/jsref/prop_node_textcontent.asp


Nor*_*ern 11

对于那些用Google搜索这个问题而来到这里的人.我觉得这个问题最明确的答案是在MDN文档中:https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent.

你可以忘记所有可能让你感到困惑的点,但要记住两件事:

  1. 当您尝试更改文本时,textContent通常是您要查找的属性.
  2. 当您尝试从某个元素中获取文本时,innerText如果用户使用光标突出显示元素的内容然后将其复制到剪贴板,则会近似用户将获得的文本.并textContent为您提供了一切,可见还是隐藏,包括<script><style>元素.


Mr *_*ter 7

除了其他答案中提到的所有差异之外,这是我最近才发现的另一个差异:

尽管据说该innerText属性自 2016 年以来已经标准化,但它在浏览器之间表现出差异:Mozilla 忽略 中的 U+200E 和 U+200F 字符(“lrm”和“rlm”)innerText,而 Chrome 则不会。

console.log(document.getElementById('test').textContent.length);
console.log(document.getElementById('test').innerText.length);
Run Code Online (Sandbox Code Playgroud)
<div id="test">[&#x200E;]</div>
Run Code Online (Sandbox Code Playgroud)

Firefox 报告 3 和 2,Chrome 报告 3 和 3。

还不确定这是否是一个错误(如果是,则在哪个浏览器中),或者只是我们必须忍受的那些奇怪的不兼容性之一。

  • 哇。惊奇地发现!! (3认同)

Mil*_*dro 5

textContent返回全文并且不关心可见性,而 whileinnerText关心可见性。

<p id="source">
    <style>#source { color: red; }</style>
    Text with breaking<br>point.
    <span style="display:none">HIDDEN TEXT</span>
</p>
Run Code Online (Sandbox Code Playgroud)

输出textContent

#source { color: red; } Text with breakingpoint. HIDDEN TEXT
Run Code Online (Sandbox Code Playgroud)

输出innerText(注意如何innerText识别诸如 之类的标签<br>,并忽略隐藏元素):

Text with breaking point.
Run Code Online (Sandbox Code Playgroud)