DOM-文本节点

内容列表

文本(Text)节点虽然很多时候我们直接用 innerHTML 去赋值替换,但当我们进行一些细微的修改时,了解一下 DOM 操作还是非常有用的。

文本节点

文本节点的 DOM 操作是不常用的,我们通常直接用元素节点的 innerHTML 属性直接替换其所有文本节点,但当我们要对文本节点进行局部操作时 DOM 操作却是很有用的。下面列举一些文本节点常用的属性及方法:

  • textContent
  • appendData()
  • deleteData()
  • insertData()
  • replaceData()
  • subStringData()
  • splitText()
  • normalize
  • Data

需要注意的是,我们在元素节点中留下的空格、回车符、制表符等空白字符也是被解析成文本节点的,所以说我们不压缩页面代码的话,会有许多无用的文本节点影响性能。

文本节点的 DOM 操作

下面就详细介绍一下文本节点常用的 DOM 操作的过程,首先来了解一下如何创建一个文本节点并将其插入到 DOM 树中。

创建节点并更新到 DOM 树

文本(Text)节点不同于元素节点,在 document 对象上也有专门用来创建文本节点的方法。

  • createTextNode()

exp:

<body>
  <h1></h1>
</body>
<script>
  var textO = document.createTextNode('Hello World!');
    document.querySelector('h1').appendChild(textO);
</script>

获取节点的文本值

文本节点的文本值是呈现出来给用户看的,但有些时候我们也需要让程序去获知被用户修改后的文本值。

  • data
  • nodeValue
  • substringData()

exp:

<body>
    <h1>Hello World!</h1>
</body>
<script>
    var textO = document.querySelector('h1').firstChild;
    // 获取文本值
    console.log(texto.data); // Hello World!
    console.log(textO.nodeValue); // Hello World!
    // 获取文本值的长度
    console.log(textO.length);
    console.log(textO.data.length);
    console.log(textO.nodeValue.length);
    // 获取部分文本值(开始索引<不包括>,长度)
    console.log(textO.substringData(6,5)); // World
</script>

节点的文本值操作

文本节点的文本值事实上也是重要的数据,这涉及到一些查看、增添、删除、修改等操作。

  • appendData()
  • deleteData()
  • insertData()
  • replaceData()
  • splitText()

exp:

<body>
    <h1>Hello World</h1>
</body>
<script>
    var textO = document.querySelector('h1').firstChild;
    // 添加(尾部附加)
    textO.appendData('!');
    console.log(textO.data); // Hello World!
    // 删除(删除位置索引<不包括>,删除长度)
    textO.deleteData(7,4);
    console.log(textO.data); // Hello W!
    // 插入(插入位置索引<其后插入>,插入值)
    textO.insertData(7,'orld');
    console.log(textO.data); // Hello World!
    // 替换(替换位置索引<不包括>,替换长度,替换值)
    textO.replaceData(6,5,'China')
    console.log(textO.data); // Hello China!
    // 分割(分割位置索引<不包括>,分割长度)
    var sText = textO.splitText(6,5);
    console.log(sText.data); // China!
</script>

splitText() 方法会按要求将一个文本节点分割成多个文本节点,同时还会返回包含分割部分的文本节点对象。

多个文本节点的情况

当我们在一个元素节点内写了很多文本值时,只要它们没有被元素节点分割,所有相邻的文本值将被浏览器解析成一个文本节点。但是,当我们主动创建多个文本节点并插入到 DOM 树中时,浏览器却不会合并这些相邻的文本节点。

元素内所有文本值

当元素节点内的文本值被多个元素节点分割时,这些文本值会被解析成多个文本节点。元素节点的 innerHTML 属性获取的是该节点内的所有后代节点(包括文本节点与元素节点),而我们有时候却只想查看该节点的所有文本值(所有文本节点合并而成),下面就来看看如何查看。

  • textContent

exp:

<body>
    <h1>Hello <i>World!</i></h1>
</body>
<script>
    var eleO = document.querySelector('h1');
    // 获取所有文本值
    console.log(eleO.textContent); // Hello World!
    // 设置所有文本值
    eleO.textContent = 'Hello World!';
    console.log(eleO.textContent); // Hello World!
</script>

我们会发现,textContentinnerHTML 获取的值不同,但是它们在进行设置时行为却是一样的,也就是说会覆盖掉目标元素节点内的所有后代节点。

合并多个文本节点

当有多个相邻的文本节点存在时,我们可以让其合并成一个文本节点,只需要在它们的父元素节点上使用 normalize() 方法即可,这里不再做示例。

  • normalize()

结语

文本节点的属性及方法大部分都可以用在注释节点(Comment)上。

参考

  • 《DOM 启蒙》,Cody Lindley,陈养剑 译

相关

CSS 清除浮动

在浮动布局中,有时候会因为父元素没有设置高度而子元素浮动导致父元素坍塌,我们就需要清除浮动撑起父元素的高度,在这里总结一下常用方法。

了解更多

那些年之电子产品

把这几年工作上学买过的电子产品整理下;

大学开始至今年代久远,整理的时间不一定对的上,简单整理一下当手帐册供日后做纪念:

了解更多

使用 Jest 和 Puppeteer 构建 Web 自动化测试平台

测试为软件的稳定和完善提供了必要的支持,Web 前端开发领域相比于做单元测试,端到端测试更有意义和价值。谷歌发布的 Puppeteer 工具和脸书发布的 Jest 测试工具为 Web 端到端测试提供了极大的便利,这里记录了如何使用它们构建一个 Web 自动化测试平台。

了解更多