DOM,Document Object Model,即文档对象模型,是HTML和XML文档的一个操作接口。通过DOM,JavaScript可以获取和操作文档上的所有元素。
DOM是什么
BOM中曾提到,浏览器在页面初始化时,会在内存创建一个全局对象,即window
对象,用来描述当前窗口的信息。window
对象下回有6大核心模块,其中document
模块即文档对象,它用来描述HTML/XML文档的内容。
浏览器解析HTML/XML文档的方式是将HTML和XML文档中的每个元素/属性/文本等映射成一个节点,节点之间存在层级关系,因此,整个文档被解析完成后,会生成一个由不同节点组成的树状结构,这个树状结构被称为DOM树。document
对象就用来描述DOM树的状态和属性,同时也提供操作DOM的API。
DOM树示例:
DOM是一个W3C标准,它定义了如何操作文档的标准。它允许代码动态地获取和更新文档的内容、结构和样式。
“The W3C Document Object Model (DOM) is a platform and language-neutral interface that allows programs and scripts to dynamically access and update the content, structure, and style of a document.”
W3C DOM标准包括3个不同的部分:
- 核心DOM(Core DOM):所有文档类型的标准模型
- XML DOM:XML文档的标准模型
- HTML DOM:HTML文档的标准模型
其中,HTML DOM是HTML文档的标准对象模型和操作接口,它定义了:
- HTML元素均为对象
- HTML元素的属性
- 操作HTML元素的方法
- HTML元素的事件
通过HTML DOM,JavaScript可以动态地对HTML进行如下操作:
- 添加、修改和移除页面中HTML元素和属性
- 修改页面中的CSS样式
- 实现事件交互
- 增加新的事件
DOM的层级
DOM0
早期JavaScript版本中提供了操作Web文档的API,如图像和表单,我们可以通过这样的方法访问第一张图片或名为”user”的表单:
1 | document.images[0]; |
这实际上是未形成标准的实验性质的初级阶段DOM,习惯上被称为DOM0,它出现在W3C进行标准化之前,即没有形成真正的标准。
1997年6月和10月,Netscape Navigator 4和IE 4分别发布,这两种浏览器都大幅扩展了DOM,使JavaScript的功能大大增加,此时随之出现一个新的名词:DHTML。
DHTML即Dynamic HTML(动态HTML)。它不是一项新技术,而是将HTML,CSS,JavaScript技术组合的一种描述。它可以
- 利用HTML把网页标记为各种元素
- 利用CSS设置元素样式及其显示位置
- 利用JavaScript操控页面元素和样式
利用DHTML,看起来可以操控页面元素来实现复杂的效果,但实际上,因为缺乏标准,两种浏览器实现相同的功能的方法完全不一样,导致JavaScript的发展陷入混乱。
实际上,DOM0只是历史坐标系中的一个参照点,并非真正的标准。
DOM1
1998年10月,W3C结合不同浏览器的优点推出了一个标准化的DOM,即DOM1。W3C将DOM定义为一个与平台和编程语言无关的接口,通过这个接口可以动态地访问和修改文档的内容、结构和样式。
DOM1定义了HTML和XML文档的底层结构。在DOM1中,DOM包含DOM core和DOM HTML两部分。DOM core规定了XML文档的结构标准,允许获取和操作文档的人一部分。DOM HTML在DOM核心的基础上通过添加HTML专用的对象和函数进行了扩展,如document
对象。
DOM2
鉴于DOM1仅以映射文档结构为目标,DOM2引入了更多的交互能力。DOM2在原有DOM的基础上添加了鼠标、用户界面事件(DHTML长期支持鼠标和用户界面事件)、范围、遍历(重复执行DOM文档)和层叠样式表(CSS)的支持。同时也对DOM1的核心进行了扩展,从而可支持XML的命名空间。
DOM2引入了下列模块,在模块中包含了众多新类型和新接口:
- DOM视图(DOM views):定义了跟踪不同文档视图的接口
- DOM事件(DOM events):定义了事件和事件处理的接口
- DOM样式(DOM style):定义了基于CSS为元素应用样式的接口
- DOM遍历和范围(DOM traversal and range):定义了遍历和操作文档树的接口
DOM3
DOM3进一步扩展了DOM,引入了以下模块:
- DOM加载和保存模块(DOM load and save):引入了以统一方式加载和保存文档的方法
- DOM验证模块(DOM validation):定义了验证文档的方法
- DOM核心的扩展(DOM style):支持XML1.0规范,涉及XML Infoset, XPath 和 XML Base
浏览器对不同级别的DOM的支持情况如下:
可以看到,移动端常用的webkit内核浏览器目前只支持DOM2,不支持DOM3。
操作DOM
HTML DOM methods are actions you can perform (on HTML Elements).
HTML DOM properties are values (of HTML Elements) that you can set or change.
DOM方法即你可以对HTML元素做什么,DOM属性即你可以设置和修改的HTML元素的值。
在DOM树中,所有的HTML元素都被映射成对象,每一个对象的方法和属性都是你操作它们的接口。
document
对象
document
对象即载入浏览器的HTML文档对象。如果你想要访问HTML页面中的元素,一般都从document
对象开始访问。
访问HTML元素
document.getElementById(id)
按照ID查找元素,返回一个符合条件的元素document.getElementsByTagName(name)
按照标签查找元素,返回一组符合条件的元素document.getElementsByClassName(name)
(IE5-8无效) 按照类名查找元素,返回一组符合条件的元素document.querySelector()
返回第一个符合(css选择器)条件的元素document.querySelectorAll(selectors)
也可以从某一个非document对象查找子元素
修改HTML结构
document.createElement(ele)
创建元素document.removeChild(ele)
移除元素document.appendChild(ele)
添加元素document.replaceChilde(ele)
替换元素document.write(text)
写入HTML流
获取HTML对象
document.anchors
返回所有的锚点document.body
返回文档的body
document.cookie
返回文档的cookie
document.documentElement
返回<html>
元素document.forms
返回所有的表单document.head
返回文档的头部document.images
返回所有的图片document.links
返回所有的链接document.title
返回文档的标题
修改HTML元素属性
element.innerHTML=new html content
修改元素内包含的HTML内容element.attribute = new value
修改元素的属性element.setAttribute(attr, value)
设置元素属性element.style.property = new style
修改元素的样式
DOM事件
事件类型
onclick
点击onload / onunload
进入/离开页面,常可以用于检查cookiesonchange
常用于输入字段的验证onmouseover / onmouseout
鼠标指针移动到/离开元素onmousedown / onmouseup / onclick
鼠标点击的全部过程(鼠标按键被点击、鼠标按钮被松开、鼠标完成点击)
添加事件的方法
addEventListener(事件类型,事件函数)
addEventListener()
有如下特征:
- 给指定元素添加事件处理函数
- 添加的事件处理函数不会覆盖原有事件函数
- 可以通过
addEventListener()
给一个元素添加多个事件处理函数 - 可以给一个元素的同一个事件添加多个事件处理函数(如添加两个点击事件)
- 可以对任意的DOM对象进行事件监听,不止于HTML元素,如
window
对象也可以添加 addEventListener()
方法使处理事件冒泡更容易- 可以通过
removeEventListener()
方法移除事件监听 addEventListener()
的第一个事件类型参数不需要添加”on”前缀
DOM 节点
在HTML DOM中,所有的事物都是节点。根据W3C的HTML DOM标准:
- 整个文档是一个文档节点
- 每个HTML元素都是元素节点
- HTML元素内的文本是文本节点
- 每个HTML属性是属性节点
- 注释是注释节点
父、子、同胞节点
节点树中的节点彼此之间有层级关系。
- 在节点树中,定点节点被成为根(root),即
<html>
元素 - 每个节点都有父节点,除了根
- 一个节点可以拥有任意数量的子节点
- 同胞节点拥有相同的父节点
节点属性实现定位
可以通过节点的属性来定位到其他节点:
parentNode
对象的父节点childNodes
对象的所有子节点childNodes[index]
对象子节点中的某一个(根据索引号查找)firstChild
第一个子元素lastChild
最后一个子元素nextSibling
后一个同胞节点previousSibling
前一个同胞节点
节点属性获取文档
document.body
文档<body>
元素(<body>
到</body>
内部的内容)document.documentElement
整个HTML文档(<html>
到</html>
内部的内容)
节点的基本属性
nodeName
- 只读属性
- 元素节点的
nodeName
返回元素的标签名(且总是返回标签的大写形式) - 属性节点的
nodeName
返回属性名称 - 文本节点的
nodeName
总返回#text
- 文档节点的
nodeName
总返回#document
nodeValue
- 返回节点的值
- 元素节点的
nodeValue
总是null
- 文本节点的
nodeValue
是文本本身 - 属性节点的
nodeValue
是属性值
nodeType
- 返回节点的类型
HTML DOM节点的类型
1-元素节点
- 元素节点对应HTML标签元素
- 它的节点类型
nodeType
值是1 nodeName
返回的值是大写的标签名nodeValue
值是null
2-属性节点
属性节点(attribute)对应HTML标签的属性,它继承标签对应的元素节点,不作为DOM树的一部分。
- 它的
nodeType
值是2 nodeName
返回属性名nodeValue
返回属性值
3-文本节点
文本节点(text)对应HTML标签内容。
- 它的
nodeType
值是3 nodeName
总是返回'#text'
nodeValue
返回文本内容
8-注释节点
注释节点(comment)表示网页中的HTML注释
- 它的
nodeType
值是8 nodeName
总是返回#comment
nodeValue
值未注释的内容
9-文档节点
文档节点(document)表示HTML文档,指向document对象
- 它的
nodeType
值是9 nodeName
值为#document
nodeValue
是null
10-文档类型节点
文档类型节点(DocumentType)包含着与文档的doctype有关的所有信息
- 它的
nodeType
值为10 nodeName
值为doctype的名称nodeValue
值为null
11-文档片段节点
文档片段节点(DocumentFragment)是一种轻量级的文档,可以包含和控制节点,但不会像完整的文档那样占用额外的资源
- 它的
nodeType
值为11 nodeName
是#document-fragment
nodeValue
是null
参考: