textContent vs innerText

Node类型的innerText属性和textContent属性可谓相爱相杀,作为最早被IE引入的innerText属性虽然被广泛使用,但是在2016年前一直是非标准属性,直到2016年才被HTML标准正式指定。

Node类型的innerText属性和textContent属性十分类似,但还是有所不同:

  1. textContent会返回所有元素的非标签内容,其中包括<style>标签和<script>标签,但innerText不会返回这两个标签的内容。
  2. textContent会返回被隐藏的子代元素的内容,但innerText不会。
  3. innerText受CSS样式影响(参见第二点可能于此有关),MDN上说“it will trigger a reflow”,即触发重排(reflow),但textContent不会,这样会导致innerText的性能比textContent低。

在一篇国外Blog(http://kellegous.com/j/2013/02/27/innertext-vs-textcontent/)中提到一个例子:

<div id="t"><div>lions,
tigers</div><div style="visibility:hidden">and bears</div></div>

用textContent实际上会输出

用innerText会输出

你看,textContent会保留换行符并且将隐藏的子代元素的文本内容也显示出来,然而innerText则不会保留换行符(其实是以一个空格代替)以及不会显示隐藏的自带元素的文本内容。另外说到这个,还有一点需要说明的是innerText跟布局系统是息息相关的(这一点跟textContent有很大不同),比如还是刚才的例子,我改了一下:

<div id="t"><div>lions,tigers</div><div>and bears</div></div>

注意id为“t”的元素的两个子元素为块级元素,innerText输出为:

两个块级元素的文本各占一行(块级元素的feature),

但如果两个子元素为内联元素呢:

<div id="t"><span>lions,tigers</span><span>and bears</span></div>

这里我把两个div改成span元素,输出如下:

看!两个内联元素的文本在同一行(内联元素的feature)。

再来看看textContent,还是刚才的例子:

<div id="t"><div>lions,tigers</div><div>and bears</div></div>

textContent输出如下:

看!即使两个子元素都为块级元素,输出文本依然在同一行,除非两个块级子元素写在两行。内联元素也是同理,除非两个内联子元素写在两行,否则还是输出在同一行(这里就不赘述了,有兴趣的同学可以自行实验内联元素版本的)。

可见,innerText与textContent最大的不同就是innetText会考虑布局系统(其中包括考虑是否为块级元素还是内联元素)。

innerText会影响性能,因为它需要一些来自布局系统(CSS)的信息来考虑怎样将文本呈现给用户,我这里做一个性能测试(Firefox 58.0.2):

这里要重新渲染一个列表:

<ul class="list">
      <li>first</li>
      <li>second</li>
      <li>third</li>
      <li>forth</li>
      <li>fifth</li>
      <li>sixth</li>
      <li>seven</li>
      <li>eight</li>
      <li>nine</li>
      <li>ten</li>
      <li>eleven</li>
      <li>twelve</li>
      <li>thirteen</li>
      <li>fourteen</li>
      <li>fifteen</li>
      <li>sixteen</li>
      <li>seventeen</li>
      <li>eighteen</li>
      <li>nineteen</li>
      <li>twenty</li>
</ul>

JavaScript代码:

var ul=document.getElementsByClassName("list")[0];  // 获取列表

// innerText渲染时间测试
console.time("innerText");
for(var i=0;i<ul.childElementCount;i+=1){
    ul.children[i].innerText="innerText";
}
console.timeEnd("innerText");

// textContent渲染时间测试
console.time("textContent");
for(var j=0;j<ul.childElementCount;j+=1){
    ul.children[j].textContent="textContent";
}
console.timeEnd("textContent");

这是我随机获取的渲染时间数据:

测试1:

测试2:

测试3:

测试4:

测试5:

测试6:

由以上实验可知innerText的确有很大的性能问题,但时至今日依然会有很多人把innerText作为textContent的替代方案,你能在很多js库看到 node.textContent||node.innerText 的身影,这确实带来了很多性能问题,现在推荐使用的是textContent。

原文地址:https://www.cnblogs.com/linweinb/p/8440446.html

时间: 2025-01-17 12:40:31

textContent vs innerText的相关文章

textContent 与innerText

转自下面这位大神: http://zhangyaochun.iteye.com/blog/1391370 其实关于这textContent与innerText有很多碎碎的东西,不过个人觉得还是一个不错的topic,好好讲讲吧. 1.关于兼容性 这个很多人应该都了解: innerText除了ff3.6外,Chrome Safari Opera均支持 textContent除IE8及以下版本外,IE9 Chrome Safari Opera均支持 2.关于返回值 第一:这个其实也算兼容性里面的一种,

关于innerText和textContent

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>RunJS</title> </head> <body> <div name="dddd"> <ul> <li&g

[转]被玩坏的innerHTML、innerText、textContent和value属性

一.前言 由于innerText并非W3C标准属性,因此我们无法在FireFox中使用它,一般情况下我们可以使用textContent来代替,但它两者是否就能完全等同呢?在坑爹的表单元素(如input.textarea等)中表现是否依旧诡异呢?文本将记录一些实验结果,避免日后被玩坏. 二.innerHTML 由于innerText和textContent均为对innerHTML内容作不同的处理而成,因此我们需要先明确innerHTML属性的特点. 赋值操作:先对值内容进行模式匹配,然后把处理后的

JS魔法堂:被玩坏的innerHTML、innerText、textContent和value属性

一.前言 由于innerText并非W3C标准属性,因此我们无法在FireFox中使用它,一般情况下我们可以使用textContent来代替,但它两者是否就能完全等同呢?在坑爹的表单元素(如input.textarea等)中表现是否依旧诡异呢?文本将记录一些实验结果,避免日后被玩坏. 二.innerHTML 由于innerText和textContent均为对innerHTML内容作不同的处理而成,因此我们需要先明确innerHTML属性的特点. 赋值操作:先对值内容进行模式匹配,然后把处理后的

innerHTML outerHTML innerText textContent的区别

在网上看了很多博文介绍他们之间的区别,大部分都说FF中innerText不能使用,但经过自己试验,是可以用的,所以自己把各种情况总结了一下. 首先是innerHTML,这个就不用多说了,返回的是标签内部所有的内容,包括标签和文本,还有空格 举两个栗子,对比一下空格导致的输出区别 <div id="main">1 <span>123</span> <p>222</p> <div class="test"

innerHTML,innertext ,textcontent,write()

innerhtml属于对象的一个属性,一般用于向已经存在的标签中写入内容,或者读取标签的内容. innertext属于对象的一个属性,一般只能用于写入内容,或者读取内容,不能读取dom 中的标签,且只适用于IE. 综上,一般我们为了提高代码的兼容性,建议使用innerhtml.但是innerhtml在IE 下却只能读取不能操作,这就涉及到createelement方法以及appendchild,先创建元素节点,继续用appendchild添加子元素,然后innerhtm添加内容. textcon

innerText与textContent的异同

转载自BetaRabbit的博文 今天在使用innerText时遇到一个兼容性问题,FireFox不支持innerText方法,查了下MDN,发现FireFox下有个类似的方法,叫textContent,它和IE的innerText类似, 都是用来获取(设置)元素中text的方法. 语法 设置 element.textContent = "text"; 获取 var text = element.textContent;      Note: textContent和innerText

innerText兼容处理

转载自:https://www.cnblogs.com/leejersey/p/3520497.html:稍微改了一下和加了一些注释: IE.Safari.Opera和Chrome支持innerText属性.Firefox虽然不支持innerText,但支持作用类似的textContent属性.textContent是DOM3级规定的一个属性,而且也得到了safari.opera和Chrome的支持.为了确保跨浏览器兼容,有必要想下面这样通过函数来检测可以使用哪个属性:(注:与之对应的还有inn

CSS实现的几款不错的菜单栏

前言 自从做了智慧城市这个项目之后,我一个做后端的开发者,瞬间转为前端开发,不过我还是很喜欢前端的.前端那些事,其实蛮有意思的,HTML实现的是静态的,使用ajax之后就可以和数据库交互了,加上js和jQuery之后就动起来了,加上CSS之后就更加炫酷了.因为项目中需要,查资料和编写了一些炫酷的二级菜单,分享给大家,好东西就要分享嘛! 一.滑动菜单 1.代码: 1 <!DOCTYPE HTML> 2 <html lang="en-US"> 3 <head&