DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API(应用程序编程接口)。

DOM 描绘了一个层次化的节点树,允许开发人员添加、移除和修改页面的某一部分。

DOM1 级将 HTML 和 XML 文档形象地看作一个层次化的节点树,可以使用 JavaScript 来操作这个节点树,进而改变底层文档的外观和结构。
DOM 由各种节点构成,简要总结如下。

  1. 最基本的节点类型是 Node ,用于抽象地表示文档中一个独立的部分;所有其他类型都继承自Node 。
  2. Document 类型表示整个文档,是一组分层节点的根节点。在 JavaScript 中, document 对象是Document 的一个实例。使用 document 对象,有很多种方式可以查询和取得节点。
  3. Element 节点表示文档中的所有 HTML 或 XML 元素,可以用来操作这些元素的内容和特性。
  4. 另外还有一些节点类型,分别表示文本内容、注释、文档类型、CDATA 区域和文档片段。

访问 DOM 的操作在多数情况下都很直观,不过在处理 <script> 和 <style> 元素时还是存在一些复杂性。

由于这两个元素分别包含脚本和样式信息,因此浏览器通常会将它们与其他元素区别对待。这些区别导致了在针对这些元素使用 innerHTML 时,以及在创建新元素时的一些问题。
理解 DOM 的关键,就是理解 DOM 对性能的影响。DOM 操作往往是 JavaScript程序中开销最大的部分,而因访问 NodeList 导致的问题为最多。

NodeList 对象都是“动态的”,这就意味着每次访问NodeList 对象,都会运行一次查询。有鉴于此,最好的办法就是尽量减少 DOM 操作。

一、节点层次

  1. DOM 可以将任何 HTML 或 XML 文档描绘成一个由多层节点构成的结构。
  2. 节点分为几种不同的类型,每种类型分别表示文档中不同的信息及(或)标记。
  3. 每个节点都拥有各自的特点、数据和方法,另外也与其他节点存在某种关系。
  4. 节点之间的关系构成了层次,而所有页面标记则表现为一个以特定节点为根节点的树形结构。

二、Node类型

DOM1 级定义了一个 Node 接口,该接口将由 DOM 中的所有节点类型实现。这个 Node 接口在JavaScript 中是作为 Node 类型实现的;

除了 IE 之外,在其他所有浏览器中都可以访问到这个类型。
JavaScript 中的所有节点类型都继承自 Node 类型,因此所有节点类型都共享着相同的基本属性和方法。

节点类型由在 Node 类型中定义的下列12 个数值常量来表示,任何节点类型必居其一:

  • Node.ELEMENT_NODE (1);
  • Node.ATTRIBUTE_NODE (2);
  • Node.TEXT_NODE (3);
  • Node.CDATA_SECTION_NODE (4);
  • Node.ENTITY_REFERENCE_NODE (5);
  • Node.ENTITY_NODE (6);
  • Node.PROCESSING_INSTRUCTION_NODE (7);
  • Node.COMMENT_NODE (8);
  • Node.DOCUMENT_NODE (9);
  • Node.DOCUMENT_TYPE_NODE (10);
  • Node.DOCUMENT_FRAGMENT_NODE (11);
  • Node.NOTATION_NODE (12)。

三、Document 类型

JavaScript 通过 Document 类型表示文档。在浏览器中, document 对象是 HTMLDocument (继承自 Document 类型)的一个实例,表示整个 HTML 页面。

而且, document 对象是 window 对象的一个属性,因此可以将其作为全局对象来访问。

Document 节点具有下列特征:

  • nodeType 的值为 9;
  • nodeName 的值为 "#document" ;
  • nodeValue 的值为 null ;
  • parentNode 的值为 null ;
  • ownerDocument 的值为 null ;
  • 其子节点可能是一个 DocumentType (最多一个)、 Element (最多一个)、 ProcessingInstruction或 Comment 。

四、Element 类型

除了 Document 类型之外, Element 类型就要算是 Web 编程中最常用的类型了。

Element 类型用于表现 XML或 HTML元素,提供了对元素标签名、子节点及特性的访问。

Element 节点具有以下特征:

  • nodeType 的值为 1;
  • nodeName 的值为元素的标签名;
  • nodeValue 的值为 null ;
  • parentNode 可能是 Document 或 Element ;
  • 其子节点可能是 Element 、 Text 、 Comment 、 ProcessingInstruction 、 CDATASection 或EntityReference 。

五、Text 类型

文本节点由 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 中也保存着同样的值。

六、Comment 类型

注释在 DOM 中是通过 Comment 类型来表示的。 Comment 节点具有下列特征:

  • nodeType 的值为 8;
  • nodeName 的值为 "#comment" ;
  • nodeValue 的值是注释的内容;
  • parentNode 可能是 Document 或 Element ;
  • 不支持(没有)子节点。

Comment 类型与 Text 类型继承自相同的基类,因此它拥有除 splitText() 之外的所有字符串操作方法。

与 Text 类型相似,也可以通过 nodeValue 或 data 属性来取得注释的内容。

七、CDATASection 类型

CDATASection 类型只针对基于 XML 的文档,表示的是 CDATA 区域。与 Comment 类似,
CDATASection 类型继承自 Text 类型,因此拥有除 splitText() 之外的所有字符串操作方法。
CDATASection 节点具有下列特征:

  • nodeType 的值为 4;
  • nodeName 的值为 "#cdata-section" ;
  • nodeValue 的值是 CDATA 区域中的内容;
  • parentNode 可能是 Document 或 Element ;
  • 不支持(没有)子节点。

CDATA 区域只会出现在 XML 文档中,因此多数浏览器都会把 CDATA 区域错误地解析为 Comment或 Element 。

八、DocumentType 类型

DocumentType 类型在 Web 浏览器中并不常用,仅有 Firefox、Safari 和 Opera 支持它。

Document-Type 包含着与文档的 doctype 有关的所有信息,它具有下列特征:

  • nodeType 的值为 10;
  • nodeName 的值为 doctype 的名称;
  • nodeValue 的值为 null ;
  • parentNode 是 Document ;
  • 不支持(没有)子节点。

九、DocumentFragment 类型

在所有节点类型中,只有 DocumentFragment 在文档中没有对应的标记。

DOM 规定文档片段(document fragment)是一种“轻量级”的文档,可以包含和控制节点,但不会像完整的文档那样占用额外的资源。

DocumentFragment 节点具有下列特征:

  • nodeType 的值为 11;
  • nodeName 的值为 "#document-fragment" ;
  • nodeValue 的值为 null ;
  • parentNode 的值为 null ;
  • 子节点可以是 Element 、 ProcessingInstruction 、 Comment 、 Text 、 CDATASection 或EntityReference 。

虽然不能把文档片段直接添加到文档中,但可以将它作为一个“仓库”来使用,即可以在里面保存将来可能会添加到文档中的节点。

十、Attr 类型

元素的特性在 DOM 中以 Attr 类型来表示。在所有浏览器中(包括 IE8),都可以访问 Attr 类型的构造函数和原型。

从技术角度讲,特性就是存在于元素的 attributes 属性中的节点。

特性节点具有下列特征:

  • nodeType 的值为 2;
  • nodeName 的值是特性的名称;
  • nodeValue 的值是特性的值;
  • parentNode 的值为 null ;
  • 在 HTML 中不支持(没有)子节点;
  • 在 XML 中子节点可以是 Text 或 EntityReference 。

尽管它们也是节点,但特性却不被认为是 DOM 文档树的一部分。

开发人员最常使用的是 getAt-tribute() 、 setAttribute() 和 remveAttribute() 方法,很少直接引用特性节点。

JavaScript_DOM(文件对象模型)的更多相关文章

  1. HTML 之 DOM文件对象模型

    文件对象模型 (DOM: Document Object Model) DOM 是 W3C定义的一种访问文档的标准. "The W3C Document Object Model (DOM) ...

  2. JS基础速成(三)- DOM(文件对象模型)

    .t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.DOM树的基本结构 DOM节点分为三大类:元素节点(标签节点),属性节 ...

  3. Python实现XML文件解析

    1. XML简介 XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用.它是web ...

  4. python XML文件解析:用xml.dom.minidom来解析xml文件

    python解析XML常见的有三种方法: 一是xml.dom.*模块,是W3C DOM API的实现,若需要处理DOM API则该模块很合适, 二是xml.sax.*模块,它是SAX API的实现,这 ...

  5. 【TensorFlow】Python解析xml文件

    最近在项目中使用TensorFlow训练目标检测模型,在制作自己的数据集时使用了labelimg软件对图片进行标注,产生了VOC格式的数据,但标注生成的xml文件标签值难免会产生个别错误造成程序无法跑 ...

  6. Python—使用xm.dom解析xml文件

    什么是DOM? 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口. 一个 DOM 的解析器在解析一个 XML 文档时,一次性读 ...

  7. Struts(View)

    案例:http://blog.csdn.net/jiuqiyuliang/article/details/39061305 减少在运用MVC设计模型来开发Web应用的时间. l  M —— JavaB ...

  8. 《jQuery知识点总结》(一)

    write less do more写更少的代码实现更多的功能DOM:document object model (文件对象模型)选择器(选择元素的对象或者节点)id 选择器 $("#id& ...

  9. jquery note--czx

    -------------------------------------------------------+++------------------------------------------ ...

随机推荐

  1. SetViewportOrgEx和SetWindowOrgEx

    在MM_TEXT映射模式下使用这两个函数. 对于 BOOL SetViewportOrgEx( HDC hdc, // 设备内容HANDLE int X, // 新Viewport的x坐标 int Y ...

  2. create-react-app创建项目后,运行npm run eject报错解决方法

    运行npm run eject报错解决方法 主要问题是脚手架添加.gitgnore文件,但是却没有本地仓库,使用以下命令操作以下就可以了 git init git add . git commit - ...

  3. face_recognition人脸识别框架

    一.环境搭建 1.系统环境 Ubuntu 17.04 Python 2.7.14 pycharm 开发工具 2.开发环境,安装各种系统包 人脸检测基于dlib,dlib依赖Boost和cmake $ ...

  4. Docker容器网络前提提要

    docker exec -it kvstor1 /bin/sh ##[进入一个redis容器] docker exec -it web1 /bin/sh ##[进入一个nginx容器] ###dock ...

  5. linux上传与下载文件命令

    //文件从Linux系统上传到其他系统. sz空格+文件名 //文件从其他系统下载到Linux系统. rz //之后会弹出路径选择框,选择文件,即可下载到当前路径.

  6. 【leetcode】sudokuSolver数独解题

    0.摘要 小时候在报纸上玩过数独,那时候觉得很难,前几天在leetcode上遇到了这个题,挺有意思于是记录下来 一般一道数独题,就像他给的例子这样,9*9的格子,满足 行,列 ,宫均取1-9的数,切互 ...

  7. JavaSE---基本数据类型存储大小

  8. mac版AIcc2019旋转扭曲工具在哪?AI cc 2019 for Mac旋转扭曲工具如何使用?

    想要旋转图片?ai mac通过线性的或非线性的算法,能使图像旋转.扭曲变形.今天小编要给大家分享的是如何查找使用mac版AIcc2019旋转扭曲工具,有需要的朋友快来学习学习吧! https://ww ...

  9. setTimeout()和setInterval()的用法及区别

    setInterval 方法表示每间隔一段时间执行一次函数,会一直执行下去,除非手动 clearInterval 来停止. var i = 10; var timer = setInterval(() ...

  10. layui-treeTable v2.0添加搜索功能

    layui-treeTable 添加搜索功能 在树形表格头部加一个input框: <div class="layui-inline"> <input class= ...