DOM是W3C(万维网联盟)制定的用于访问诸如XML和XHTML文档的标准。“W3C文档对象模型(DOM)是一个使程序和脚本有能力动态地访问和更新文档的内容、结构以及样式的平台和语言中立的接口。”
W3C DOM被分为3个不同的部分/级别(parts/levels):
➢核心DOM:用于任何结构化文档的标准模型
➢XML DOM:用于XML文档的标准模型
➢HTML DOM:用于HTML文档的标准模型
DOM定义了所有文档元素的对象和属性,以及访问它们的方法(接口)。
其中,XML DOM是:用于XML的标准对象模型和用于XML的标准编程接口,它是中立于平台和语言W3C的标准。XML DOM定义了所有XML元素的对象和属性,以及访问它们的方法(接口)。换句话说:XML DOM是用于获取、更改、添加或删除XML元素的标准。而HTML DOM则定义了所有HTML元素的对象和属性,以及访问它们的方法(接口)。
由于HTML DOM是基于XML DOM的,同时又是对XML DOM的一种扩展,而我们在编写网页文档时如果按照XHTML语法规范来编写代码,则此网页文档可被视为格式良好的XML文档。这样在使用DOM访问网页文档时,即可使用XML DOM,也可使用HTML DOM。
本附录中大部分关于DOM的概念均以HTML DOM的术语来讲解,这些概念同样适用于XML文档。
1.DOM节点
根据DOM规范,文档中的每个成分都是一个节点。DOM是这样规定的:
➢整个文档是一个文档节点,又称为根节点
➢每个标签是一个元素节点
➢包含在标签中的文本是文本节点
➢标签的每一个属性是一个属性节点
➢注释属于注释节点
例附录3.1:
在这个例子中:
网页文档本身就是文档节点,又称根节点。
文中包含了很多标签,每个标签都是一个元素节点。
所有的元素节点中有一个元素节点很特殊,它位于标签层次结构的最外层,只能有一个,包含其他所有元素,这个特殊的元素节点叫根元素,在网页文档中,根元素总是<html></html>这一对标签。
<html></html>元素节点又包含了两个下级子节点,分别是<head></head>元素节点和<body></body>元素节点,而<head></head>元素节点又包含了一个下级子节点即<title></title>元素节点,而<body></body>子节点则包含了两个下级子点节,分别是<h1></h1>元素节点和<a></a>元素节点。
<title></title>元素节点包含了一个下级子点节,它是一个文本节点即“文档标题”这个字符串,同样<h1></h1>元素节点和<a></a>元素节点也分别包含了一个下级子节点,同样是文本节点“我的标题”和文本节点“我的链接”。
<a></a>元素节点还包含了一个属性节点,即href=http://www.***.com。属性节点实际上就是一个名/值对。
2.DOM节点树
DOM把文档视为一种包含了多个节点的树结构。这种树结构被称为节点树。可通过这棵树访问所有节点,可以修改或删除它们的内容,也可以创建新的节点。
上面的例子,可由图附录3.1表示它的DOM树:
图附录3.1 DOM树
这棵节点树展示了节点的集合,以及它们之间的联系。这棵树从根节点开始,然后在树的最低层级向文本节点长出枝条:节点树中的节点彼此之间都有等级关系。
父、子和同级节点用于描述这种关系。父节点拥有子节点,位于相同层级上的子节点称为同级节点(兄弟或姐妹)。
在节点树中,顶端的节点成为根节点。
根节点之外的每个节点都有一个父节点。
节点可以有任何数量的子节点。
叶子是没有子节点的节点。
同级节点是拥有相同父节点的节点。
注意:父节点:Parent Node;子节点:Children Node;同级节点:Sibling Node。
3.DOM接口及其属性和方法
DOM把文档模拟为一系列节点接口。可通过JavaScript或其他编程语言来访问节点。对DOM的编程接口是通过一套标准的属性和方法来定义的。
属性经常按照“某事物是什么”的方式来使用(例如节点名是“title”)。
方法经常按照“对某事物做什么”的方式来使用(例如添加“input”节点)。
➢DOM属性
一些典型的DOM属性:
x.nodeName:x的名称
x.nodeValue:x的值
x.parentNode:x的父节点
x.childNodes:x的子节点
x.attributes:x的属性节点
说明:在上面的列表中,x是一个节点对象。
➢DOM方法
一些典型的DOM方法:
x.getElementsByTagName(name):获取带有指定标签名称的所有元素
x.appendChild(node):向x插入子节点
x.removeChild(node):从x删除子节点
说明:在上面的列表中,x是一个节点对象。
从上例中的<title>元素获取文本的JavaScript代码:
在此语句执行后,txt保存的值是“文档标题”。(www.xing528.com)
解释:
document:由解析器即浏览器创建的文档节点或称根节点,它实际上由Window的document属性提供。
getElementsByTagName("title")[0]:第一个<title>元素
childNodes[0]:title>元素的第一个子节点(文本节点)
nodeValue:节点的值(文本自身)
在上面的例子中,getElementsByTagName()是方法,而childNodes和nodeValue是属性。
4.访问节点
可以通过3种方法来访问节点:
通过使用getElementsByTagName()方法
通过循环(遍历)节点树
通过利用节点的关系在节点树中导航
➢getElementsByTagName()方法
getElementsByTagName()返回拥有指定标签名的所有元素。
语法:
下面的例子返回x元素下的所有<input/>元素:
注意:上面的例子仅返回x节点下的<input/>元素,x可能是网页内的一个表单。
要返回文档中的所有<title>元素,请使用:
注意:document就是文档本身(文档节点)。
getElementsByTagName()方法返回节点列表(node list)。节点列表是节点的数组。下面的代码可访问文档中的所有<meta/>元素,得到节点列表,存储在变量x中。
可通过下标访问x中的某个<meta/>元素。要访问第3个<meta/>,可以编写:
注意:下标以0起始。另外节点列表包含length属性定义节点列表的长度(即节点的数目)。你能够通过使用length属性来循环一个节点列表:
➢遍历节点
下面的代码循环根元素的子节点:
➢利用节点的关系进行导航
下面的代码通过利用节点的关系在节点树中进行导航:
5.节点信息
通过节点的属性可获取节点的信息。3个重要的DOM节点属性是:nodeName,nodeValue,nodeType。
➢nodeName属性
nodeName属性获取节点的名称。nodeName是只读的。元素节点的nodeName与标签名相同;属性节点的nodeName是属性的名称;文本节点的nodeName永远是#text。
➢nodeValue属性
nodeValue属性获取或设置节点的值。元素节点的nodeValue是undefined;文本节点的nodeValue是文本自身;属性节点的nodeValue是属性的值。
例子:下面的代码检索第一个<title>元素内部的文本节点的值:
例子:下面的代码更改第一个<title>元素的文本节点的值:
➢nodeType属性
nodeType属性规定节点的类型。nodeType是只读的。
最重要的节点类型见表附录3.1。
表附录3.1 节点类型
6.属性节点
属性节点比较特殊,它只属于元素节点,但不包含在元素节点的下级子节点列表之内。要获取元素的所有属性,可以访问元素节点的attributes属性从而得到属性节点列表。而属性节点列表支持getNamedItem()方法获得特定名称的属性节点对象,也可使用索引对属性节点列表进行遍历。
示例如下:
例附录3.2:
7.节点操作
➢创建节点
使用document文档对象的一系列方法可以创建各种节点。较常用的见表附录3.2。
表附录3.2 创建节点方法
➢添加节点
新创建的节点需要与其他已存在的节点组织关系,才能让它真正属于文档树。有多种方法为已有的节点添加节点,较常用的见表附录3.3。
表附录3.3 添加节点方法
例附录3.3:
➢修改节点
改变节点一般指改变元素内部的文本,或改变元素的属性值。这两种情况都可以在访问到文本节点或属性节点后,为其nodeValue赋值来实现更改。对于后者,还可以在元素节点上调用setAttribute()方法来实现属性值的改变。
例附录3.4:
➢删除节点
删除节点一般是指从元素节点内部删除子元素或元素包含的文本,也可实现对元素节点包含的属性节点的删除。
例附录3.5:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。