DOM(文档对象模型)是针对 HTML 和 XML 文档的一个API(应用程序编程接口)。DOM 描绘了一个层次化的节点树,允许开发人员添加、移除和修改页面的某一部分。

层次节点


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

<html>
  <head>
    <title> Sample Page </title>
  </head>
  <body>
    <p> Hello World! </p>
  </body>
</html>

可以将这个简单的 HTML 文档表示为一个层次结构:

Document
  Element html
    Element head
      Element title
        Text Sample Page

    Element body
      Element p
        Text Hello World!

文档节点是每个文档的根节点,在这个例子中,文档节点只有一个子节点,即 <html> 元素,我们称之为 文档元素。文档元素是文档的最外层元素,文档中的其他所有元素都包含在文档元素中。每个文档只能有一个文档元素。在 HTML 中,文档元素始终是 <html> 元素;而在 XML 中,没有预定义的元素,因此任何元素都能成为文档元素。

每一段标记都可以通过树中的一个节点来表示: HTML 元素通过元素节点来表示,特性(attribute)通过特性节点来表示,文档类型通过文档类型节点来表示,而注释通过注释节点表示。总共有 12 种节点类型,这些类型都继承自一个基类型。

Node 类型


DOM1 级定义了一个 Node 接口,该接口将由 DOM 中的所有节点类型实现。 这个 Node 接口在 Javascript 中是作为 Node 类型实现的;除了 IE 之外,其他所有浏览器中都可以访问到这个类型。Javascript 中所有节点类型都继承自 Node 类型,因此所有节点类型都共享着相同的基本属性和方法。

每个节点都有一个 nodeType 属性,用于表明节点的类型。 节点类型由在 Node 类型中定义的下列 12 个数值常量来表示,任何节点类型必居其一:

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

值得注意的是,并不是所有节点类型都受到 Web 浏览器的支持。 开发人员最常用的就是元素文本节点。而且,上面列出的变量,在 IE 中并没有什么卵用。

<div> </div>
<script>
  var a = document.querySelector('div');
  console.log(a.nodeType === 1); // 兼容所有浏览器
  console.log(a.nodeType === Node.ELEMENT_NODE); // 不兼容 IE
</script>

操作节点


// 访问子节点
var firstNode = someNode.childNodes[0];
var secondNode = someNode.childNodes.item(1);
var count = someNode.childNodes.length; // 能动态变化, childNode并不是快照

var firstNode = someNode.firstChild;
var lastNode = someNode.lastChild;

// 访问兄弟节点
var nextNode = someNode.nextSibling;
var preNode = someNode.previousSibling;

// 判断有没有子节点
var hasChild = someNode.hasChildNodes();
var hasChild = someNode.childNodes.length > 0;

// 访问节点的文档节点
var documentNode = someNode.ownerDocument;

/* 操作节点 */

// appendChild
var returnNode = someNode.appendChild(newNode);
console.log(returnNode === newNode) // true
console.log(someNode.lastChild === newNode) // true

// 如果传入到 appendChild() 中的节点已经是文档的一部分了,那就将该节点从原来的位置移到新的位置
var returnNode = someNode.appendChild(someNode.firstChild);
console.log(returnNode === someNode.firstChild); // false
console.log(returnNode === someNode.lastChild); // true

// insertBefore(a, b) 将a插入b前 a和b互为Sibling
// 插入后成为最后一个子节点
var returnNode = someNode.insertBefore(newNode, null);
console.log(newNode === someNode.lastChild); // true

// 插入后成为第一个子节点
var returnNode = someNode.insertBefore(newNode, someNode.firstChild);
console.log(returnNode === someNode.firstChild); // true

// removeChild 移除节点
var formerFirstChild = someNode.removeChild(someNode.firstChild);

// replaceChild 替换
// 替换第一个子节点
var returnNode = someNode.replaceChild(newNode, someNode.firstChild);

前面介绍的都是操作节点的子节点,也就是说,要使用这些方法必须先获得父节点。最后介绍的 cloneNode() 方法适合所有节点。

<ul>
  <li> apple </li>
  <li> orange </li>
  <li> pear </li>
</ul>

<script>
  var myList = document.querySelector('ul');

  // 深度复制
  var deepList = myList.cloneNode(true);
  console.log(deepList.childNodes.length); // 7

  // 浅复制
  var shallowList = myList.cloneNode(false);
  console.log(shallowList.childNodes.length); // 0
</script>

DOM 概况的更多相关文章

  1. DOM Document节点类型详解

    在前面 DOM 概况 中,我们知道了 DOM 总共有 12 个节点类型,今天我们就来讲下 DOM 中最重要的节点类型之一的 document 节点类型. 1.概况 Javascript 通过 Docu ...

  2. 【转】Virtual DOM

    前言 React 好像已经火了很久很久,以致于我们对于 Virtual DOM 这个词都已经很熟悉了,网上也有非常多的介绍 React.Virtual DOM 的文章.但是直到前不久我专门花时间去学习 ...

  3. virtual DOM的作用:将DOM的维护工作由系统维护转交给virtual DOM维护

    virtual DOM的作用:将DOM的维护工作由系统维护转交给virtual DOM维护 两个方面:对应用端 & 对DOM端(渲染准备的计算) 1.将DOM状态的维护工作由系统维护转交给vi ...

  4. DOM与CSS样式表

    在前文 <DOM与元素节点内联样式>中我们了解了用 DOM 提供的接口操作元素节点内联样式的方法,今天我们来学习一下如何用 DOM 操作 CSS 样式表. CSS 样式表概况 通过使用 H ...

  5. DOM Element节点类型详解

    上文中我们讲解了 DOM 中最重要的节点类型之一的 Document 节点类型,本文我们继续深入,谈谈另一个重要的节点类型 Element . 1.概况 Element 类型用于表现 HTML 或 X ...

  6. WEB 技术分类 Javascript DOM(Element Node) BOM

    Web technology for developers   Web 技术文档 备注:本文介绍web technology的分类,各自职责,因为之前一直就没有搞明白各种技术.各种名词究竟是属于哪个范 ...

  7. 全面理解虚拟DOM(1)

    最近一两年前端最火的技术莫过于 reactjs,angularJS,vuejs,即便你没用过也可能听过,像ReactJS由业界顶尖的互联网公司facebook提出,其本身有很多先进的设计思路,比如页面 ...

  8. Vue:(一)概况

    Vue:https://cn.vuejs.org/ (一)Vue概况 Vue本身并不是一个框架 Vue结合周边生态构成一个灵活的.渐进式框架 声明式渲染 组件系统 客户端路由 状态管理 构建工具 (二 ...

  9. 全面理解虚拟DOM,实现虚拟DOM

    1.为什么需要虚拟DOM DOM是很慢的,其元素非常庞大,页面的性能问题鲜有由JS引起的,大部分都是由DOM操作引起的.如果对前端工作进行抽象的话,主要就是维护状态和更新视图:而更新视图和维护状态都需 ...

随机推荐

  1. SQL优化技巧--远程连接对象引起的CTE性能问题

    背景 最近SSIS的开发过程中遇到几个问题.其中使用CTE时,遇到一个远程连接对象,结果导致严重的性能问题,为了应急我就修改了代码. 之前我写了一篇介绍CTE的随笔包含了CTE的用法等: http:/ ...

  2. php.ini配置解析

    为了让PHP读取这个文件,它必须被命名为'php.ini'. PHP 查找配置文件次序:当前工作目录:环境变量PHPRC  ; 指明的路径:编译时指定的路径.  ; 在windows下,编译时的路径是 ...

  3. MDX函数(官方顺序,带示例)

    MDX函数(官方顺序) 1.  AddCalculatedMembers (MDX) 返回通过将计算成员添加到指定集而生成的集. 语法: AddCalculatedMembers(Set_Expres ...

  4. C++/CLI——读书笔记《Visual C++/CLI从入门到精通》 第Ⅰ部分

    =================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载  请通过右 ...

  5. android handler runnable使用实例(关键是内部run中停止)

    .java package com.example.mydemo; import android.app.Activity; import android.os.Bundle; import andr ...

  6. 微软Nokia 222:可拍照可上网 售价37美元 32GB的microSD卡扩展

    腾讯科技讯 8月27日,在几乎所有厂商都在智能手机领域大肆拼杀的时候,微软日前却悄悄地发布了一款功能手机Nokia 222. 目前,尽管全球许多发达国家的居民都对互联网已经再熟悉不过了,但事实上全球依 ...

  7. 解析json格式数据

    实现目标 读取文件中的json格式数据,一行为一条json格式数据.进行解析封装成实体类. 通过google的Gson对象解析json格式数据 我现在解析的json格式数据为: {",&qu ...

  8. emacs 新手笔记(二) —— 分割窗格 (split window)

    初极狭,才通人.复行数十步,豁然开朗.—— 陶渊明·桃花源记 ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 使用 split-window-xxx 函数可 ...

  9. C++/C#互调步骤

    一.C#调用C++ dll步骤(只能导出方法):  * 1. c++建立空项目->源文件文件夹中添加cpp文件和函数  * 2. c++属性设置中,配置类型设置为动态库dll,公共语言运行时支持 ...

  10. NOIP2002pj产生数[floyd 高精度]

    背景 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则:一位数可变换成另一个一位数:规则的右部不能为零. 例如:n=234.有规则(k=2):2-> 53 ...