文本节点由Text类型表示,包含的是可以按照字面解释的纯文本内容,纯文本中可以包含转义后的HTML字符但不能包含HTML代码。原型链继承关系为:textNode.__proto__->Text.prototype->CharacterData.prototype->Node.prototype->EventTarget.prototype->Object.prototype。

Text节点具有以下特征

  • nodeType值为3
  • nodeName值为"#text" ('string'类型)
  • nodeValue的值为节点所包含的文本
  • parentNode是一个Element
  • 没有子节点
  • 可以通过nodeValue(继承自Node.prototype)或data(继承自CharacterData.prototype)属性访问Text节点包含的文本。对nodeValue的修改也会通过data反映出来。反之亦然。
var text=document.createTextNode('文本');
text.nodeValue;// "文本"
text.data;// "文本"

使用下列方法操作节点中文本,操作会引起已经存在在文档中的文本节点发生变化。
(1).继承自CharacterData.prototype的
appendData(text):将text添加到节点的末尾。

var text=document.createTextNode('文本');
text.appendData('增');
text;// "文本增"

deleteData(offset,count):从offset指定位置开始删除count个字符。

text.deleteData(1,1);
text;// "文增"

insertData(offset,text):从offset指定位置插入text。

text.insertData(1,'本');
text;// "文本增"

replaceData(offset,count,text):用text替换从offset指定位置开始到到offset+count为止处的文本。也可以理解成用text替换从offset开始长度为count的文本。

text.replaceData(1,1,'我');
text;// "文我增"

substringData(offset,count):提取从offset指定位置开始到offset+count为止处(不包括count索引处的)的字符串。可以理解为从offset开始提取count个字符。

text.substringData(1,2);// "我增"

length:保存着节点中字符的数目,而且nodeValue.length和data.length中也保存着同样的值。

text.length;// 2 文本节点的length属性
text.nodeValue.length;// 2
text.data.length;// 2
//text.nodeValue和text.data为字符串,字符串继承自String.prototype.leng的length属性

(2).继承自Text.protoype
splitText(offset):从offset指定位置将当前文本节点分成两个文本节点,返回后面的那个文本节点,此时的文本节点对象text为前面的文本节点。

text.splitText(1);// "增"
text;// "我"

(3).在修改文本节点时还要注意,当修改的内容包含HTML(或XML,取决于文档)标签时,文本节点当作文本来处理,但innerHTML(继承自Element.prototype)却会解释为标签。

var text=document.getElementsByClassName('gb_P gb_R')[0];
text;// <span class=​"gb_P gb_R">​xiaotouming​</span>​
text.firstChild;// "xiaotouming" 是文本节点
text.firstChild.nodeValue='<strong>sdv</strong>'; //此时原来网页中"xiaotouming"的文本内容变为了"<strong>sdv</strong>"
text;// <span class=​"gb_P gb_R">​<strong>sdv</strong>​</span>​
text.innerHTML='<strong>sdv</strong>';
text;// <span class=​"gb_P gb_R">​...​</span>​ 此时strong被解释为标签,sdv文本加粗

目录

创建文本节点
规范化文本节点
分割文本节点

创建文本节点

创建新文本节点的同时也会为其设置ownerDocument属性。不过除非把新节点添加到文档树种已经存在的节点中否则我们不会在浏览器窗口中看到新节点。

text=document.createTextNode('<b>sdvc</b>');
text.ownerDocument;// #document

一般情况下每个元素只有一个文本节点,不过某些情况下可能包含多个文本子节点。

var ele=document.createElement('div');
var text1=document.createTextNode('文本一');
var text2=document.createTextNode('文本二');
ele.appendChild(text1);
ele.appendChild(text2);
ele;// <div>​"文本一""文本二"</div>​


如果两个节点是相邻同胞节点,那么这两个节点中的文本就会连起来显示,中间不会有空格。

规范化文本节点

DOM文档中存在相邻的同胞节点很容易产生混乱,分不清哪个文本节点是哪个字符串。
将相邻文本节点合并的方法:normalize():继承自Node.prototype。如果在一个包含两个或多个文本节点的父元素上调用normalize()方法,则会将所有相邻文本节点合并为一个节点,结果节点的nodeValue等于将合并前每个本文节点的nodeValue值拼接起来的值。

var ele=document.createElement('div');
var text1=document.createTextNode('文本一');
var text2=document.createTextNode('文本二');
ele.appendChild(text1);
ele.appendChild(text2);
ele.childNodes.length;//
ele.normalize();
ele.childNodes.length;//

然而浏览器在解析文档时永远不会创建相邻文本节点,不论元素中文本怎么写,总是认为是一个文本节点,这种两个以上文本节点存在只会在执行DOM操作的结果出现。

分割文本节点

text.splitText(offset):继承自Text.prototype,这个方法从offset指定位置将一个文本节点分成两个文本节点,按照指定位置分割nodeValue值,原来的文本节点将包含从开始到指定位置之前的内容,返回的新文本节点将包含剩下的文本。分割文本节点是从文本节点提取数据的一种常用DOM解析技术。

var ele=document.createElement('div');
var text=document.createTextNode('Hello World');
ele.appendChild(text); var newnode=ele.firstChild.splitText(5);
newnode;// " World" 文本节点
text;// "Hello" 文本节点
ele.childNodes.length;//

兼容性

<=IE8会忽略掉HTML元素中的文本节点。FF和Chrome和>IE8不会忽略。

参考

《JavaScript高级程序设计》

从原型链看DOM--Text类型的更多相关文章

  1. 从原型链看DOM--Node类型

    前言: 本系列从原型,原型链,属性类型等方面下手学习了DOM文档对象模型,旨在弄清我们在DOM中常用的每一个属性和方法都清楚它从哪里来要到哪里做什么事,这样对于理解代码有一定启发.全靠自己在总结中摸索 ...

  2. 从原型链看DOM--Comment,CDATASection,DocumentType,DocumentFragment,Attr类型

    这次总结的是剩下的这些DOM类型节点,可能你见过却不经常使用但是了解一下总是好的,可以加深对DOM体系的整体理解~.本篇要介绍的是Comment,CDATASection,DocumentType,D ...

  3. 从原型链看DOM--Document类型

    JavaScript通过Document类型表示文档,原型链的继承关系为:document.__proto__->HTMLDocument.prototype->Document.prot ...

  4. 从原型链看DOM--Element类型

    Element类型用于表现XML或HTML元素,提供对元素标签名,子节点及特性的访问.原型链的继承关系为 某节点元素.__proto__->(HTML某元素Element.prototype)- ...

  5. [js]js原型链继承小结

    这是之前总结的, 发现有很多的毛病,就是重点不突出,重新翻看的时候还是得耗费很长时间去理解这玩意. js中的继承 js中什么是类 1,类是函数数据类型 2.每个类有一个自带prototype属性 pr ...

  6. JavaScript继承基础讲解,原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承

    说好的讲解JavaScript继承,可是迟迟到现在讲解.废话不多说,直接进入正题. 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考<面向对象J ...

  7. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用原型链和EventTrigger

    原型链是JS的必备,作为ECMAScript4,原型链也是支持的. 特别说明,ActionScript3是支持完整的面向对象继承支持的,原型链只在某些非常特殊的情况下使用. 本文旨在介绍如何使用原型链 ...

  8. js javascript 原型链详解

    看了许多大神的博文,才少许明白了js 中原型链的概念,下面给大家浅谈一下,顺便也是为了巩固自己 首先看原型链之前先来了解一下new关键字的作用,在许多高级语言中,new是必不可少的关键字,其作用是为了 ...

  9. MySQL varchar 最大长度,text 类型占用空间剖析

    MySQL 表中行的最大大小为 65,534(实际行存储从第二个字节开始)字节.每个 BLOB 和 TEXT 列只占其中的 5 至 9 个字节. 那么来验证下 varchar 类型的实际最大长度: 测 ...

随机推荐

  1. 特征根法求通项+广义Fibonacci数列找循环节 - HDU 5451 Best Solver

    Best Solver Problem's Link Mean: 给出x和M,求:(5+2√6)^(1+2x)的值.x<2^32,M<=46337. analyse: 这题需要用到高中的数 ...

  2. 数据库 Proc编程二

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...

  3. 错题0913-java

    子类A继承父类B, A a = new A(); 则父类B构造函数.父类B静态代码块.父类B非静态代码块.子类A构造函数.子类A静态代码块.子类A非静态代码块 执行的先后顺序是? A:父类B静态代码块 ...

  4. HashSet非常的消耗空间,TreeSet因为有排序功能,因此资源消耗非常的高,我们应该尽量少使用

    注:HashMap底层也是用数组,HashSet底层实际上也是HashMap,HashSet类中有HashMap属性(我们如何在API中查属性).HashSet实际上为(key.null)类型的Has ...

  5. 漫游kafka实战篇之搭建Kafka开发环境(3)

    上篇文章中我们搭建了kafka的服务器,并可以使用Kafka的命令行工具创建topic,发送和接收消息.下面我们来搭建kafka的开发环境.   添加依赖   搭建开发环境需要引入kafka的jar包 ...

  6. SurvivalShooter学习笔记(九.游戏暂停、结束)

    这里先补充一个得分管理器: 玩家得分设置成一个静态变量: public class ScoreManager : MonoBehaviour { public static int score; // ...

  7. HttpModule,HttpContext,HttpHandler

    http://www.cnblogs.com/wujy/tag/ASP.NET%E5%9F%BA%E7%A1%80/ http://www.th7.cn/Program/net/2011/12/26/ ...

  8. 教你如何在 Android 使用多线程下载文件

    # 教你如何在 Android 使用多线程下载文件 前言 在 Android 日常开发中,我们会经常遇到下载文件需求,这里我们也可以用系统自带的 api DownloadManager 来解决这个问题 ...

  9. JAVA上百实例源码网站

    JAVA源码包1JAVA源码包2JAVA源码包3JAVA源码包4 JAVA开源包1 JAVA开源包2 JAVA开源包3 JAVA开源包4 JAVA开源包5 JAVA开源包6 JAVA开源包7 JAVA ...

  10. 【BZOJ3289】Mato的文件管理 莫队算法+树状数组

    [BZOJ3289]Mato的文件管理 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是 ...