JavaScript中的DOM使用详解

1、DOM简介

文档对象模型(DOM, Document Object Model)是一个应用编程接口(API),用于在HTML中使用扩展的XML。在DOM中,HTML文档的层次结构被表示为一个树形结构。并用document对象表示该文档,树的每个子节点表示HTML文档中的不同内容。每个载入浏览器的 HTML 文档都会成为 Document 对象,Document是探索DOM的入口,利用全局变量document可以访问Document对象。DOM将整个页面抽象为一组分层节点。HTML或XML页面的每个组成部分都是一种节点,包含不同的数据。比如下面的HTML页面:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Sample Page</title>
</head>
<body>
    <h1>Hello World!!!</h1>
</body>
</html>

将以上HTML代码分解为DOM节点层次图如下:

DOM通过创建表示文档的树,让开发者可以随心所欲地控制网页的内容和结构。使用DOM API,可以轻松地删除、添加、替换、修改节点。

2、DOM级别

  • DOM Level 1: 1998年10月,DOM Level 1成为W3C的推荐标准。这个规范由两个模块组成:DOM Core和DOM HTML。前者提供了一种映射XML文档,从而方便访问和操作文档任意部分的方式;后者扩展了前者,并增加了特定于HTML的对象和方法。

  • DOM Level 2: DOM Level 1的目标是映射文档结构,而DOM Level 2的目标则宽泛得多。这个对最初DOM的扩展增加了对(DHTML早就支持的)鼠标和用户界面事件、范围、遍历(迭代DOM节点的方法)的支持,而且通过对象接口支持了层叠样式表(CSS)。另外,DOM Level 1中的DOM Core也被扩展以包含对XML命名空间的支持。DOM Level 2新增了以下模块,以支持新的接口:

    DOM视图:描述追踪文档不同视图(如应用CSS样式前后的文档)的接口。
    DOM事件:描述事件及事件处理的接口。
    DOM样式:描述处理元素CSS样式的接口。
    DOM遍历和范围:描述遍历和操作DOM树的接口。
    
  • DOM Level 3: DOM Level 3进一步扩展了DOM,增加了以统一的方式加载和保存文档的方法(包含在一个叫DOM Load and Save的新模块中),还有验证文档的方法(DOM Validation)。在Level 3中,DOM Core经过扩展支持了所有XML 1.0的特性,包括XML Infoset、XPath和XML Base。

  • DOM4: 目前,W3C不再按照Level来维护DOM了,而是作为DOM Living Standard来维护,其快照称为DOM4。DOM4新增的内容包括替代Mutation Events的Mutation Observers。

3、Web浏览器对DOM的支持情况

DOM标准在Web浏览器实现它之前就已经作为标准发布了。IE在第5版中尝试支持DOM,但直到5.5版才开始真正支持,该版本实现了DOM Level 1的大部分。IE在第6版和第7版中都没有实现新特性,第8版中修复了一些问题。

网景在Netscape 6(Mozilla 0.6.0)之前都不支持DOM。Netscape 7之后,Mozilla把开发资源转移到开发Firefox浏览器上。Firefox 3+支持全部的Level 1、几乎全部的Level 2,以及Level 3的某些部分。

4、DOM节点类型

DOM规定文档中的每个成分都是一个节点(Node),HTML文档可以说由节点构成的集合,DOM节点有:

类型 描述
元素节点(Element) 上图中<html>、<body>、<h1>等都是元素节点,即标签。
文本节点(Text) 向用户展示的内容,如<li>...</li>中的JavaScript、DOM、CSS等文本。
属性节点(Attr) 元素才有属性,如标签的链接属性href=“http://www.baidu.com”。

5、DOM节点三大属性

属性 描述
nodeName 元素节点、属性节点、文本节点分别返回元素的名称、属性的名称和#text的字符串。
nodeType 元素节点、属性节点、文本节点的nodeType值分别为1、2、3。
nodeValue 元素节点、属性节点、文本节点的返回值分别为null、属性值和文本节点内容。

6、DOM 常见操作

Node为所有节点的父接口,其定义了一组公共的属性和方法,如下:

属性和方法名称 描述
nodeType 返回节点类型的数字值(1~12)
nodeName 元素节点:标签名称(大写)、属性节点:属性名称、文本节点:#text、文档节点:#document
nodeValue 文本节点:包含文本、属性节点:包含属性、元素节点和文档节点:null
parentNode 父节点
parentElement 父节点标签元素
childNodes 所有子节点
children 第一层子节点
firstChild 第一个子节点,Node 对象形式
firstElementChild 第一个子标签元素
lastChild 最后一个子节点
lastElementChild 最后一个子标签元素
previousSibling 上一个兄弟节点
previousElementSibling 上一个兄弟标签元素
nextSibling 下一个兄弟节点
nextElementSibling 下一个兄弟标签元素
childElementCount 第一层子元素的个数(不包括文本节点和注释)
ownerDocument 指向整个文档的文档节点

节点关系方法:

属性和方法名称 描述
hasChildNodes() 判断是否有子节点,包含一个或多个节点时返回true
contains() 如果是后代节点返回true
isSameNode()、isEqualNode() 判断是否是同一个节点,传入节点与引用节点的引用为同一个对象返回true
compareDocumentPostion() 确定节点之间的各种关系

7、查找节点的方法

属性和方法名称 描述
getElementById() 返回对拥有指定 id 的第一个对象的引用。
getElementsByTagName() 返回带有指定标签名的对象集合。
getElementsByName() 返回带有指定名称的对象集合。
getElementsByClassName() 返回包含一个或多个类名的对象集合。
classList 返回所有类名的数组:
add(添加);
contains(存在返回true,否则返回false);
remove(删除);
toggle(存在则删除,否则添加)
querySelector() 接收CSS选择符,返回匹配到的第一个元素,没有则null
querySelectorAll() 接收CSS选择符,返回一个数组,没有则返回[]

8、样式属性及操作

属性和方法名称 描述
style.cssText 可对style中的代码进行读写
style.item() 返回给定位置的CSS属性的名称
style.length style代码块中参数个数
style.getPropertyValue() 返回给定属性的字符串值
style.getPropertyPriority() 检测给定属性是否设置了!important,设置了返回"important";否则返回空字符串
style.removeProperty() 删除指定属性
style.setProperty() 设置属性,可三个参数:设置属性名,设置属性值,是否设置为"important"(可不写或写"")

9、元素节点属性及操作

属性和方法名称 描述
nodeName 访问元素的标签名
tagName 访问元素的标签名
createElement() 创建节点
appendChild() 末尾添加节点,并返回新增节点
insertBefore() 参照节点之前插入节点,两个参数:要插入的节点和参照节点
insertAfter() 参照节点之后插入节点,两个参数:要插入的节点和参照节点
replaceChild() 替换节点,两个参数:要插入的节点和要替换的节点(被移除)
removeChild() 移除节点
cloneNode() 克隆,一个布尔值参数,true为深拷贝,false为浅拷贝
importNode() 从文档中复制一个节点,两个参数:要复制的节点和布尔值(是否复制子节点)
insertAdjacentHTML() 插入文本,两个参数:插入的位置和要插入文本
beforebegin:在该元素前插入;
afterbegin:在该元素第一个子元素前插入
beforeend:在该元素最后一个子元素后面插入
afterend:在该元素后插入

10、属性节点属性及操作

属性和方法名称 描述
attributes 获取所有标签属性
getAttribute() 获取指定标签属性
setAttribute() 设置指定标签属
removeAttribute() 移除指定标签属
var s = document.createAttribute(“age”)
s.nodeValue = “18”
创建age属性
设置属性值为18

11、文本节点属性及操作

属性和方法名称 描述
nnerText 所有的纯文本内容,包括子标签中的文本
outerText 与innerText类似
innerHTML 所有子节点(包括元素、注释和文本节点)
outerHTML 返回自身节点与所有子节点
textContent 与innerText类似,返回的内容带样式
data 文本内容
length 文本长度
createTextNode() 创建文本
normalize() 删除文本与文本之间的空白
splitText() 分割
appendData() 追加
deleteData(offset,count) 从offset指定的位置开始删除count个字符
insertData(offset,text) 在offset指定的位置插入text
replaceData(offset,count,text) 替换,从offset开始到offscount处的文本被text替换
substringData(offset,count) 提取从ffset开始到offscount处的文本

12、文档节点属性及操作

属性和方法名称 描述
document.documentElement 代表页面中的<html>元素
document.body 代表页面中的<body>元素
document.doctype 代表<!DOCTYPE>标签
document.head 代表页面中的<head>元素
document.title 代表<title>元素的文本,可修改
document.URL 当前页面的URL地址
document.domain 当前页面的域名
document.charset 当前页面使用的字符集
document.defaultView 返回当前 document对象所关联的 window 对象,没有返回 null
document.anchors 文档中所有带name属性的元素
document.links 文档中所有带href属性的元素
document.forms 文档中所有的<form>元素
document.images 文档中所有的元素
document.readyState 两个值:loading(正在加载文档)、complete(已经加载完文档)
document.compatMode 两个值:BackCompat:标准兼容模式关闭、CSS1Compat:标准兼容模式开启
write() write()文本原样输出到屏幕
writeln() writeln()输出后加换行符
open() open()清空内容并打开新文档
close() close()关闭当前文档,下次写是新文档
(完)