HTMLElement.innerText 和 Node.textContent傻傻分不清楚?

更新日期: 2023-04-10阅读: 779标签: dom

当我们想要访问dom中的文本内容时,肯定会第一时间想到htmlElement.innerText。事实上,JavaScript 提供了两个可用于「访问元素文本内容的」属性:Node.textContent和HTMLElement.innerText。在大多数情况下,这两者似乎可以互换。但我们在互换使用它们,往往会忽略两者之间存在重要区别。


相似之处

我认为在深入研究差异之前确定这两个属性的相似之处很有帮助。这也将阐明它们在大多数情况下的使用方式。

假设有一个 HTML 元素,其中包含一些文本:

<p id="greeting">hello<strong>前端南玖</strong></p>

这两个属性都将返回元素的文本内容,包括任何子「元素」的文本内容。它们还将忽略元素内容中可能出现的「任何 HTML 标记。」而且,它们也可用于「设置元素的文本内容」

const greeting = document.getElementById('greeting');

greeting.innerText; // "hello前端南玖"
greeting.textContent; // "hello前端南玖"

greeting.innerText = '小花猫'; // <p id="greeting">小花猫</p>
greeting.textContent = '小细狗'; // <p id="greeting">小细狗</p>


差异

到目前为止,这两个属性似乎在做完全相同的事情。事实上,它们都提供了一些非常有用的便利功能。然而,当元素的内容稍微复杂一点时,它们开始表现出一些差异。

以下面的 HTML 元素为例:

<div id="container">
  <style>
    p { color: red; }
    strong { text-transform: uppercase; }
    small { display: none; }
  </style>
  <p>hello<br />我是 <strong>南玖</strong></p>
  <small>公众号 <strong>前端南玖</strong></small>
</div>

<script>
  console.log('【innerText】', container.innerText)

  console.log('【textContent】', container.textContent)
</script>

让我们看一下这两个属性各自的输出,看看它们有何不同。


在这种情况下是完全不同的,对吧?HTMLElement.innerText应该大致「匹配用户」浏览器中看到的内容。另一种思考方式是它的输出应该与用户选择元素的内容并将其复制到剪贴板时得到的结果非常相似。

根据这个定义,首先要注意的是「隐藏的元素被忽略了」。这适用于不呈现的元素,例如<style>和<script>,也适用于使用 css 隐藏的元素。在此示例中,该<small>元素是隐藏的,因此它不包含在 的输出中HTMLElement.innerText。

其次, 的输出HTMLElement.innerText被「归一化」。这意味着所有空格都折叠成一个空格,并且所有换行符都替换为单个换行符。如果存在,<br>标签也会受到尊重,因此它们会被换行符替换。

我想说的最后一点是将「文本转换」HTMLElement.innerText应用于元素的内容。在本例中,元素被转换为大写,因此 的输出反映了这一点。<strong> HTMLElement.innerText

另一方面,Node.textContent返回元素的「确切文本内容,包括任何空格和换行符。」然而,<br>标签在没有任何替代品的情况下被剥离。它还包括任何隐藏元素的文本内容,例如<style>和<script>并且没有应用任何文本转换。


表现

可是等等!还有更多!虽然HTMLElement.innerText看起来是明智的选择,但它带有性能问题。为了弄清楚浏览器呈现的内容,必须考虑 CSS,触发重排。这在计算上可能「很昂贵」,并且可能会造成无意的性能瓶颈。

在我看来,一个好的经验法则是Node.textContent尽可能使用纯文本元素。对于更复杂的元素,请尝试确定它们如何受布局和用户交互的影响。例如,只呈现一次且永远不会改变的复杂元素将是 的用例HTMLElement.innerText,但您可以将输出存储在变量中并重新使用它。


结论

HTMLElement.innerText并且Node.textContent是两个非常相似的属性,可用于访问和操作元素的文本内容。但是,它们在一些重要方面有所不同,你应该了解这些差异以选择最适合您需求的一种。始终检查你的用例并考虑你的选择对性能的影响。

  • textContent会获取所有元素的content,包括<script>和<style>元素或者可以说innerText的值依赖于浏览器的显示,textContent依赖于代码的显示
  • innerText返回值会被格式化,而textContent不会。textContent会把空标签解析成换行(几个空标签就是几行),innerText只会把block元素类型的空标签解析换行,并且如果是多个的话仍看成是一个,而inline类型的原素则解析成空格
  • innerText 会带来性能影响(innerText会触发reflow,而textContent不会)
来源公众号:前端南玖,作者:南玖 

链接: https://fly63.com/article/detial/12432

全面理解虚拟DOM,实现虚拟DOM

DOM是很慢的,其元素非常庞大,页面的性能问题鲜有由JS引起的,大部分都是由DOM操作引起的。虚拟的DOM的核心思想是:对复杂的文档DOM结构,提供一种方便的工具,进行最小化地DOM操作。

HTML文档解析和DOM树的构建

浏览器解析HTML文档生成DOM树的过程,以下是一段HTML代码,以此为例来分析解析HTML文档的原理.解析HTML文档构建DOM树的理解过程可分为两个主要模块构成,即标签解析、DOM树构建

原生js获取DOM对象的几种方法

javascript获取DOM对象的多种方法:通过id获取 、通过class获取、通过标签名获取、通过name属性获取、通过querySelector获取、通过querySelectorAll获取等

js实现DOM遍历_遍历dom树节点方法

遍历DOM节点常用一般用节点的 childNodes, firstChild, lastChild, nodeType, nodeName, nodeValue属性。在获取节点nodeValue时要注意,元素节点的子文本节点的nodeValue才是元素节点中文本的内容。

如何编写自己的虚拟DOM

要构建自己的虚拟DOM,需要知道两件事。你甚至不需要深入 React 的源代码或者深入任何其他虚拟DOM实现的源代码,因为它们是如此庞大和复杂——但实际上,虚拟DOM的主要部分只需不到50行代码。

归纳DOM事件中各种阻止方法

事件冒泡: 即事件开始时由最具体的元素(文档中嵌套层数最深的那个点)接收,事件捕获:不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件.与此同时,我们还需要了解dom事件绑定处理的几种方式:

关于DOM操作是异步的还是同步的相关理解

先列出我的理解,然后再从具体的例子中说明:DOM操作本身应该是同步的(当然,我说的是单纯的DOM操作,不考虑ajax请求后渲染等);DOM操作之后导致的渲染等是异步的(在DOM操作简单的情况下,是难以察觉的)

JavaScript DOM事件模型

早期由于浏览器厂商对于浏览器市场的争夺,各家浏览器厂商对同一功能的JavaScript的实现都不进相同,本节内容介绍JavaScript的DOM事件模型及事件处理程序的分类。

vuejs2.0如何获取dom元素自定义属性值

设置定义属性值 :data-value=.., 2.直接获取 3.通过this.$refs.***获取 1.目标DOM定义ref值: 2.通过 【this.$refs.***.属性名】 获取相关属性的值: this.$refs.*** 获取到对应的元素 ...

整理常见 DOM 操作

框架用多了,你还记得那些操作 DOM 的纯 JS 语法吗?看看这篇文章,来回顾一下~ 操作 className,addClass给元素增加 class,使用 classList 属性

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!