文本节点由Text类型表示,包含的是可以照字面解释的纯文本内容。纯文本中可以包含转义后的HTML字符,但不能包含HTML代码。Text节点具有以下特征:
nodeType的值为3;
nodeName的值为"#text";
nodeValue的值为节点所包含的文本;
parentNode是一个Element;
不支持(没有)子节点。
可以通过nodeValue属性或data属性访问Text节点中包含的文本,这两个属性中包含的值相同。对nodeValue的修改也会通过data反映出来,反之亦然。使用下列方法可以操作节点中的文本。
appendData(text):将text添加到节点的末尾。
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中也保存着同样的值。
在默认情况下,每个可以包含内容的元素最多只能有一个文本节点,而且必须确实有内容存在。来看几个例子。
上面代码给出的第一个
var textNode = div.firstChild; //或者div.childNodes[0]
在取得了文本节点的引用后,就可以像下面这样来修改它了。
div.firstChild.nodeValue = "Some other message";
TextNodeExample01.htm
如果这个文本节点当前存在于文档树中,那么修改文本节点的结果就会立即得到反映。另外,在修改文本节点时还要注意,此时的字符串会经过HTML(或XML,取决于文档类型)编码。换句话说,小于号、大于号或引号都会像下面的例子一样被转义。
//输出结果是"Some <strong>other</strong> message"
div.firstChild.nodeValue = "Some other message";
TextNodeExample02.htm
应该说,这是在向DOM文档中插入文本之前,先对其进行HTML编码的一种有效方式。
在IE8、Firefox、Safari、Chrome和Opera中,可以通过脚本访问Text类型的构造函数和原型。
- 创建文本节点
可以使用document.createTextNode()创建新文本节点,这个方法接受一个参数——要插入节点中的文本。与设置已有文本节点的值一样,作为参数的文本也将按照HTML或XML的格式进行编码。
var textNode = document.createTextNode("Hello world!");
在创建新文本节点的同时,也会为其设置ownerDocument属性。不过,除非把新节点添加到文档树中已经存在的节点中,否则我们不会在浏览器窗口中看到新节点。下面的代码会创建一个
var element = document.createElement("div");
element.className = "message";
var textNode = document.createTextNode("Hello world!");
element.appendChild(textNode);
document.body.appendChild(element);
TextNodeExample03.htm
这个例子创建了一个新
一般情况下,每个元素只有一个文本子节点。不过,在某些情况下也可能包含多个文本子节点,如下面的例子所示。
var element = document.createElement("div");
element.className = "message";
var textNode = document.createTextNode("Hello world!");
element.appendChild(textNode);
var anotherTextNode = document.createTextNode("Yippee!");element.appendChild(anotherTextNode);
document.body.appendChild(element);
TextNodeExample04.htm
如果两个文本节点是相邻的同胞节点,那么这两个节点中的文本就会连起来显示,中间不会有空格。
- 规范化文本节点
DOM文档中存在相邻的同胞文本节点很容易导致混乱,因为分不清哪个文本节点表示哪个字符串。另外,DOM文档中出现相邻文本节点的情况也不在少数,于是就催生了一个能够将相邻文本节点合并的方法。这个方法是由Node类型定义的(因而在所有节点类型中都存在),名叫normalize()。如果在一个包含两个或多个文本节点的父元素上调用normalize()方法,则会将所有文本节点合并成一个节点,结果节点的nodeValue等于将合并前每个文本节点的nodeValue值拼接起来的值。来看一个例子。
var element = document.createElement("div");
element.className = "message";
var textNode = document.createTextNode("Hello world!");
element.appendChild(textNode);
var anotherTextNode = document.createTextNode("Yippee!");
element.appendChild(anotherTextNode);
document.body.appendChild(element);
alert(element.childNodes.length); //2element.normalize();alert(element.childNodes.length); //1alert(element.firstChild.nodeValue); // "Hello world!Yippee!"
TextNodeExample05.htm
浏览器在解析文档时永远不会创建相邻的文本节点。这种情况只会作为执行DOM操作的结果出现。
在某些情况下,执行normalize()方法会导致IE6崩溃。不过,在IE6后来的补丁中,可能已经修复了这个问题(未经证实)。IE7及更高版本中不存在这个问题。
- 分割文本节点
Text类型提供了一个作用与normalize()相反的方法:splitText()。这个方法会将一个文本节点分成两个文本节点,即按照指定的位置分割nodeValue值。原来的文本节点将包含从开始到指定位置之前的内容,新文本节点将包含剩下的文本。这个方法会返回一个新文本节点,该节点与原节点的parentNode相同。来看下面的例子。
var element = document.createElement("div");
element.className = "message";
var textNode = document.createTextNode("Hello world!");
element.appendChild(textNode);
document.body.appendChild(element);
var newNode = element.firstChild.splitText(5);alert(element.firstChild.nodeValue); //"Hello"alert(newNode.nodeValue); //" world!"alert(element.childNodes.length); //2
TextNodeExample06.htm
在这个例子中,包含"Hello world!"的文本节点被分割为两个文本节点,从位置5开始。位置5是"Hello"和"world!"之间的空格,因此原来的文本节点将包含字符串"Hello",而新文本节点将包含文本"world!"(包含空格)。
分割文本节点是从文本节点中提取数据的一种常用DOM解析技术。
想要了解更多Java基础知识,可以点击评论区链接和小编一起学习java吧,此视频教程为初学者而著,零基础入门篇!给同学们带来全新的Java300集课程啦!java零基础小白自学Java必备优质教程_手把手图解学习Java,让学习成为一种享受_哔哩哔哩_bilibili