javascript基础学习系列四百一十一:Text 类型

Text 节点由 Text 类型表示,包含按字面解释的纯文本,也可能包含转义后的 HTML 字符,但不含 HTML 代码。Text 类型的节点具有以下特征:

 nodeName 值为"#text";
 nodeValue 值为节点中包含的文本;
 parentNode 值为 Element 对象;
 不支持子节点。

Text 节点中包含的文本可以通过 nodeValue 属性访问,也可以通过 data 属性访问,这两个属性包含相同的值。修改 nodeValue 或 data 的值,也会在另一个属性反映出来。文本节点暴露了以下操
作文本的方法:

 deleteData(offset, count),从位置 offset 开始删除 count 个字符;
 insertData(offset, text),在位置 offset 插入 text;
 replaceData(offset, count, text),用 text 替换从位置 offset 到 offset + count 的文本;
 splitText(offset),在位置 offset 将当前文本节点拆分为两个文本节点;
 substringData(offset, count),提取从位置 offset 到 offset + count 的文本。

除了这些方法,还可以通过 length 属性获取文本节点中包含的字符数量。这个值等于 nodeValue. length 和 data.length。
默认情况下,包含文本内容的每个元素最多只能有一个文本节点。例如:

<div></div> 
<!-- 有空格,因此有一个文本节点 -->
<div> </div> 
<!-- 有内容,因此有一个文本节点 --> 
<div>Hello World!</div>

示例中的第一个

元素中不包含内容,因此不会产生文本节点。只要开始标签和结束标签之间有内容,就会创建一个文本节点,因此第二个
元素会有一个文本节点的子节点,虽然它只包含空格。这个文本节点的 nodeValue 就是一个空格。第三个
元素也有一个文本节点的子节点,其nodeValue 的值为"Hello World!"。下列代码可以用来访问这个文本节点:

取得文本节点的引用后,可以像这样来修改它:

只要节点在当前的文档树中,这样的修改就会马上反映出来。修改文本节点还有一点要注意,就是HTML 或 XML 代码(取决于文档类型)会被转换成实体编码,即小于号、大于号或引号会被转义,如下所示:

div.firstChild.nodeValue = "Some <strong>other</strong> message"; 

这实际上是在将 HTML 字符串插入 DOM 文档前进行编码的有效方式。
创建文本节点
document.createTextNode()可以用来创建新文本节点,它接收一个参数,即要插入节点的文本。
跟设置已有文本节点的值一样,这些要插入的文本也会应用 HTML 或 XML 编码,如下面的例子所示:

创建新文本节点后,其 ownerDocument 属性会被设置为 document。但在把这个节点添加到文档树之前,我们不会在浏览器中看到它。以下代码创建了一个

元素并给它添加了一段文本消息:

element.className = "message"; 
let textNode = document.createTextNode("Hello world!"); 
element.appendChild(textNode); 
document.body.appendChild(element); 

这个例子首先创建了一个

元素并给它添加了为"message"的 class 属性,然后又创建了一个文本节点并添加到该元素。最后一步是把这个元素添加到文档的主体上,这样元素及其包含的文本
会出现在浏览器中。
一般来说一个元素只包含一个文本子节点。不过,也可以让元素包含多个文本子节点,如下面的例子所示:

element.className = "message"; 
let textNode = document.createTextNode("Hello world!"); 
element.appendChild(textNode); 
let anotherTextNode = document.createTextNode("Yippee!"); 
element.appendChild(anotherTextNode); 
document.body.appendChild(element);

在将一个文本节点作为另一个文本节点的同胞插入后,两个文本节点的文本之间不会包含空格。
规范化文本节点
DOM 文档中的同胞文本节点可能导致困惑,因为一个文本节点足以表示一个文本字符串。同样,DOM 文档中也经常会出现两个相邻文本节点。为此,有一个方法可以合并相邻的文本节点。这个方法叫 normalize(),是在 Node 类型中定义的(因此所有类型的节点上都有这个方法)。在包含两个或多个相邻文本节点的父节点上调用 normalize()时,所有同胞文本节点会被合并为一个文本节点,这个文本节点的 nodeValue 就等于之前所有同胞节点 nodeValue 拼接在一起得到的字符串。来看下面的例子:

element.className = "message"; 
let textNode = document.createTextNode("Hello world!"); 
element.appendChild(textNode); 
let anotherTextNode = document.createTextNode("Yippee!"); 
element.appendChild(anotherTextNode); 
document.body.appendChild(element); 
alert(element.childNodes.length); // 2 
element.normalize(); 
alert(element.childNodes.length); // 1 
alert(element.firstChild.nodeValue); // "Hello world!Yippee!" 

浏览器在解析文档时,永远不会创建同胞文本节点。同胞文本节点只会出现在 DOM 脚本生成的文档树中。
拆分文本节点
Text 类型定义了一个与 normalize()相反的方法——splitText()。这个方法可以在指定的偏移位置拆分 nodeValue,将一个文本节点拆分成两个文本节点。拆分之后,原来的文本节点包含开头到偏移位置前的文本,新文本节点包含剩下的文本。这个方法返回新的文本节点,具有与原来的文本节点相同的 parentNode。来看下面的例子:

element.className = "message"; 
let textNode = document.createTextNode("Hello world!"); 
element.appendChild(textNode); 
document.body.appendChild(element); 
let newNode = element.firstChild.splitText(5); 
alert(element.firstChild.nodeValue); // "Hello" 
alert(newNode.nodeValue); // " world!" 
alert(element.childNodes.length); // 2 

在这个例子中,包含"Hello world!“的文本节点被从位置 5 拆分成两个文本节点。位置 5 对应"Hello"和"world!“之间的空格,因此原始文本节点包含字符串"Hello”,而新文本节点包含文本”
world!"(包含空格)。
拆分文本节点最常用于从文本节点中提取数据的 DOM 解析技术。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值