第 3 章 DOM
本章内容
● 节点的概念
●四个非常实用的 DOM 方法: getElementById 、getElementsByTagName 、getAttribute
和 setAttribute
终于要与 DOM面对面了。能够向大家介绍 DOM是笔者的荣幸,我非常乐于带
领大家通过 DOM的眼睛去看世界。
3.1 文档: DOM 中的 “ D”
DOM是“Document Object Model ”(文档对象模型)的首字母缩写。如果没
有 document(文档), DOM也就无从谈起。当创建了一个网页并把它加载到 Web
浏览器中时, DOM就在幕后悄然而生。它将根据你编写的网页文档创建一个文档
对象。
在人类语言中,“对象”这个词的含义往往不那么明确和具体,它几乎可以
用来称呼任何一种客观存在的事物。 但在程序设计语言中, “对象”这个词的含
义非常明确和具体。
3.2 对象: DOM 中的 “ O”
在上一章的末尾,我们向大家展示了几个 JavaScript 对象的例子。你们应
该还记得,“对象” 是一种独立的数据集合 。与某个特定对象相关联的变量被称
为这个对象的属性;可以通过某个特定对象去调用的函数被称为这个对象的方
法。
JavaScript 语言里的对象可以分为三种类型:
●用户定义对象 (user-defined object ):由程序员自行创建的对象。 本
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
不讨论这种对象。
●内建对象 (native object ):内建在 JavaScript 语言里的对象,如 Array 、Math 和 Date
等。
●宿主对象 (host object ):由浏览器提供的对象。
在 JavaScript 语言的发展初期,程序员在编写 JavaScript 脚本时经常需要
用到一些非常重要的宿主对象,它们当中最基础的是 window对象。
window 对象对应着浏览器窗口本身,这个对象的属性和方法通常被统称为 B
OM(浏览器对象模型)——但我觉得称之为 Window Object Model (窗口对象模
型)更为贴切。 BOM向程序员提供了 window.open 和 window.blur 等方法,你们
在上网冲浪时看到的各种弹出窗口和下拉菜单——其数量之多已经到了泛滥成
灾的地步——几乎都是由这些方法负责创建和处理的。难怪 JavaScript 会有一
个不好的名声!
值得庆幸的是,在这本书里我们不需要与 BOM打太多的交道。我们将把注意
力集中在浏览器窗口的内部而不是浏览器窗口本身。 我们将着重探讨如何对网页
的内容进行处理,而用来实现这一目标的载体就是 document对象。
在本书的后续内容里,我们将尽可能地只讨论 document 对象的属性和方法。
现在,我们已经对 DOM中的字母“ D”( document,文档)和字母“ O”( ob
ject ,对象)做了解释,那么字母“ M”又代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
着什么呢?
3.3 模型: DOM 中的 “ M”
DOM中的“ M”代表着“ Model”(模型),但说它代表着“ Map”(地图)也
未尝不可。 模型也好,地图也罢, 它们的含义都是某种事物的表现形式。 就像一
个模型火车代表着一列真正的火车、 一张城市街道图代表着一个实际存在的城市
那样, DOM代表着被加载到浏览器窗口里的当前网页:浏览器向我们提供了当前
网页的地图(或者说模型),而我们可以通过 JavaScript 去读取这张地图。
既然是地图,就必须有诸如方向、等高线和比例尺之类的记号。要想看懂和
使用地图,就必须知道这些记号的含义和用途——这个道理同样适用于 DOM。要
想从 DOM获得信息,我们必须先把各种用来表示和描述一份文档的记号弄明白。
DOM把一份文档表示为一棵树(这里所说的“树”是数学意义上的概念),
这是我们理解和运用这一模型的关键。更具体地说, DOM把文档表示为一棵家谱
树。
家谱树本身又是一种模型。家谱树的典型用法是表示一个人类家族的谱系并
使用 parent (父)、 child (子)、 sibling (兄弟)等记号来表明家族成员之
间的关系。家谱树可以把一些相当复杂的关系简明地表示出来: 一位特定的家族
成员既是某些成员的父辈, 又是另一位成员的子辈, 同时还是另一位成员的兄弟。
类似于人类家族谱系的情况,家谱树模型也非常适合用来表示一份用 (X)HTM
L 语言编写出来的文档。
请看下面这份非常基本的网页,它的内容是一份购物清单。
这份文档可以用图 3-1 中的模型来表示。
我们来分析一下这个网页的结构。这种分析不仅可以让我们了解它是由哪些
元素构成的,还可以让我们了解为什么图 3-1 中的模型可以如此完美地把它表示
出来。在对 Doctype 做出声明后, 这份文档首先打开了一个 标签,而这个
网页里的所有其他元素都包含在这个元素里。 因为所有其他的元素都包含在其内
部,所以这个 标签既没有父辈, 也没有兄弟。如果这是一棵真正的树的话,
这个 标签显然就是树根。
图 3-1 把网页中的元素表示为一棵家谱树
这正是图 3-1 中的家谱树以 html 为根元素的原因。毫无疑问, html 元素完
全可以代表整个文档。
如果在这份文档里更深入一层,我们将发现 和两个分枝。它们
存在于同一层次且互不包含,所以它们是兄弟关系。它们有着共同的父元素
,但又各有各的子元素,所以它们本身又是其他一些元素的父元素。
元素有两个子元素: 和 (这两个元素是兄弟关系)。 <
body>元素有三个子元素: 、
和
(这三个元素是兄弟关系)。如果继
续深入下去, 我们将发现 也是一个父元素。 它有三个子元素, 它们都是 -
元素。
利用这种简单的家谱关系记号,我们可以把各元素之间的关系简明清晰地表
达出来。
例如,
和 之间是什么关系?答案是它们是兄弟关系。
那么 和 之间又是什么关系? 是 的父元素, 是的一个子元素。
如果把各种文档元素想像成一棵家谱树上的各个节点的话,我们就可以用同
样的记号来描述 DOM。不过,与使用“家谱树”这个术语相比,把一份文档称为
一棵“节点树”更准确。
3.3.1 节点
节点( node)这个名词来自网络理论,它代表着网络中的一个连接点。网络
是由节点构成的集合。
在现实世界里,一切事物都由原子构成。原子是现实世界的节点。但原子本
身还可以进一步分解为更细小的亚原子微粒。这些亚原子微粒同样是节点。
DOM也是同样的情况。文档也是由节点构成的集合,只不过此时的节点是文
档树上的树枝和树叶而已。
在 DOM里存在着许多不同类型的节点。就像原子包含着亚原子微粒那样,有
些 DOM节点类型还包含着其他类型的节点。
1. 元素节点
DOM的原子是元素节点( element node )。
在描述刚才那份“购物清单”文档时,我们使用了诸如 、和
之类的元素。如果把 Web上的文档比作一座大厦, 元素就是建造这座大厦的砖块,
这些元素在文档中的布局形成了文档的结构。
各种标签提供了元素的名字。文本段落元素的名字是“ p”,无序清单元素
的名字是“ul ”,列表项元素的名字是“ li ”。
元素可以包含其他的元素。在我们的“购物清单”文档里,所有的列表项元
素都包含在一个无序清单元素的内部。 事实上,没有被包含在其他元素里的唯一
元素是 元素。它是我们的节点树的根元素。
2.文本节点
元素只是不同节点类型中的一种。如果一份文档完全由一些空白元素构成,
它将有一个结构, 但这份文档本身将不会包含什么内容。 在网上,内容决定着一
切,没有内容的文档是没有任何价值的,而绝大多数内容都是由文本提供的。
在“购物清单”例子里, 元素包含着文本“ Don’t forget to buy this
stuff. ”。它是一个文本节点( text node )。
在 XHTML文档里,文本节点总是被包含在元素节点的内部。但并非所有的元
素节点都包含有文本节点。 在“购物清单” 文档里,
元素没有直接包含任何
文本节点——它包含着其他的元素节点 (一些 - 元素),后者包含着文本节点。
3.属性节点
还存在着其他一些节点类型。例如,注释就是另外一种节点类型。但我们这
里还想向大家再多介绍一种节点类型。
元素都或多或少地有一些属性,属性的作用是对元素做出更具体的描述。例
如,几乎所有的元素都有一个 title 属性,而我们可以利用这个属性对包含在元
素里的东西做出准确的描述:
在 DOM中, title="a gentle reminder" 是一个属性节点( attribute node ),
如图 3-2 所示。因为属性总是被放在起始标签里, 所以属性节点总是被包含在元
素节点当中。
并非所有的元素都包含着属性,但所有的属性都会被包含在元素里。
图 3-2 一个元素节点,它包含着一个属性节点和一个文本节点
在前面的“购物清单”示例文档里,我们可以清楚地看到那个无序清单元素
(
)有个 id 属性。如果曾经使用过 CSS,你们对 id 和 class 之类的属性应
该不会感到陌生。 不过,为了照顾那些对 CSS还不太熟悉的读者, 我们下面将简
要地重温几个最基本的 CSS概念。
4.CSS:层叠样式表
DOM并不是人们与网页的结构打交道的唯一手段。我们还可以通过 CSS(层
叠样式表)告诉浏览器应该如何显示一份文档的内容。
类似于 JavaScript 脚本,对样式的声明既可以嵌在文档的 部分(这
需要用到