textContent 与 innerText 之间的区别

IT技术 javascript
2021-01-28 09:22:41

JavaScript 中textContent之间有什么区别innerText

我可以使用textContent如下:

var logo$ = document.getElementsByClassName('logo')[0];
logo$.textContent = "Example";
6个回答

Kelly Norton 的博文:innerText 与 textContent 中很好地概述了innerText之间的主要区别您可以在下面找到摘要:textContent

  1. innerText是非标准的,textContent更早被标准化了。
  2. 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 中无效)。
  3. 因此,innerText性能更高:它需要布局信息来返回结果。
  4. 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;
}
关于点“3”(性能)。我做了一个快速测试,但我不认为这是真的。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);在控制台中执行它并查看。在某些情况下(例如在此站点上) textContent 在 mail.google.com 上会更好一些 - 反之亦然。
2021-03-21 09:22:41
@ShimonS的innerText更加表现重是真实的,而是被赋予相对采取:如果innerText是100倍慢textContent于平均,并且textContent每个操作毫秒的需要1/1000,一毫秒的1/10仍然会觉得快于人类. 此外,2 之间有意义的比较只能是元素包含很多隐藏的东西,比如<script>style="display: none;"孩子
2021-03-29 09:22:41
另外值得注意的是:innerText<br>元素转换为换行符,而textContent将忽略它们。因此<br>,使用时将连接两个单词,它们之间只有一个元素(并且没有空格)textContent
2021-03-30 09:22:41
innerText之间的另一个行为差异textContent:如果您text-transform通过 CSS更改元素的 ,它将影响 'innerText' 的结果,但不会影响textContent. 例如: innerTextof <div style="text-transform: uppercase;">Hello World</div>将是“HELLO WORLD”,而textContent将是“Hello World”。
2021-04-08 09:22:41
那么在使用setter时有什么区别吗?喜欢elem.textContent = 'foobar'vselem.innerText = 'foobar'
2021-04-11 09:22:41

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

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

  1. 当您尝试更改文本时,textContent通常是您要查找的属性。
  2. 当您尝试从某个元素中抓取文本时,innerText如果用户使用光标突出显示该元素的内容,然后将其复制到剪贴板,则该文本近似于用户将获得的文本。textContent为您提供可见或隐藏的一切,包括<script><style>元素。
“此外,由于innerText 考虑了CSS 样式,因此读取innerText 的值会触发回流以确保最新的计算样式。(回流的计算成本可能很高,因此应尽可能避免。)”“回流发生在什么时候浏览器必须再次处理和绘制部分或全部网页,例如在交互式网站上进行更新之后。” developer.mozilla.org/en-US/docs/Glossary/Reflow innerText <-> ReFlow 关系。那些 MDN 文章比其他答案更具解释性。
2021-03-17 09:22:41

两个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/JavaScript/Reference/Global_Objects/Object/defineProperty

https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent

这也是它的规范:w3.org/TR/DOM-Level-3-Core/core.html 另外(非常旧的)浏览器支持表(webdevout.net/browser-support-dom#dom3core)建议,它支持 IE9+,因此对于 IE8 及更早版本,它innerText是您的朋友。
2021-03-15 09:22:41
这里引用 MDN 中关于innerText 的一段话——“这个特性最初是由Internet Explorer 引入的,在被所有主要浏览器厂商采用后,于2016 年在HTML 标准中正式指定。”
2021-03-25 09:22:41
当它不支持时,polyfill 如何在 IE8 中工作Object.defineProperty()
2021-04-07 09:22:41
你为什么不更新你的答案?html.spec.whatwg.org/multipage/...
2021-04-07 09:22:41
实际上,不支持 ie8 或使用 polyfill 是一个更好的主意。我在我的帖子中发布了 polyfill
2021-04-11 09:22:41

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

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

http://www.w3schools.com/jsref/prop_node_textcontent.asp