动态HTML与W3C文档对象模型详解
立即解锁
发布时间: 2025-08-20 01:27:11 阅读量: 1 订阅数: 5 


JavaScript入门与实践指南
### 动态 HTML 与 W3C 文档对象模型详解
#### 1. JavaScript 标准与兼容性
当前所有 JavaScript 实现都应遵循 1999 年 12 月发布的 ECMAScript 第 3 版标准。截至 2006 年 11 月,ECMAScript 第 4 版正在开发中。尽管微软和网景的 JavaScript 方言过去存在诸多差异,但现在已足够相似,可视为同一种语言。Opera 和 Safari 浏览器也支持并提供对该标准的相同支持。不过,在使客户端对象脚本在主流浏览器之间兼容方面,仍存在一些不兼容性。
#### 2. 文档对象模型(DOM)概述
DOM 是一种独立于浏览器类型来表示文档的方式,它允许开发者通过一组通用的对象、属性、方法和事件访问文档,并使用脚本动态更改网页内容。由于不同脚本语言(如 JavaScript 和 VBScript)有不同语法,浏览器厂商通常会对通用语言(如 JavaScript)添加一些小的变体。为确保不出现特定实现问题,W3C 以 DOM 标准的形式提供了一组通用的对象、属性和方法。
#### 3. DOM 标准的不同级别
- **Level 0**:严格来说,并不存在真正的 Level 0 标准,它实际上指的是在 DOM 标准之前浏览器厂商实现的“旧方法”。例如,使用 `document.forms[0].elements[1].value = “button1”;` 这种更线性的方式访问表单属性和方法。这些方法已被新方法取代,本章不再详细介绍。
- **Level 1**:是标准的第一个版本,分为核心(可应用于 XML 和 HTML 的对象、属性和方法)和 HTML(特定于 HTML 的对象、属性和方法)两个部分。核心部分处理文档结构的导航和操作,对象、属性和方法较为抽象;HTML 部分提供与所有 HTML 元素对应的对象集合。2000 年,Level 1 进行了修订和修正,但仅形成了工作草案,未成为 W3C 的完整推荐标准。
- **Level 2**:已完成,如今许多浏览器已实现了其中的许多属性、方法和事件。它在核心和 HTML 特定属性及事件规范的基础上,增加了事件和样式表的规范。虽然还提供了关于视图和遍历范围的部分,但本书不做详细介绍。由于最新版本的浏览器已实现了该级别 DOM 的事件和样式部分的一些功能,后续会使用到这些特性。
- **Level 3**:2004 年达到推荐状态,旨在解决 Level 2 标准中事件模型仍存在的许多复杂问题,并增加了对 XML 特性的支持,如内容模型和将 DOM 保存为 XML 文档。只有少数浏览器支持 Level 3 的部分功能。
#### 4. 浏览器对标准的兼容性
几乎没有浏览器能 100% 符合任何标准,不过 Firefox、Opera 和 Safari/Chrome 等浏览器在 DOM 方面非常接近。因此,不能保证 DOM 标准的所有对象、属性和方法在给定版本的浏览器中都可用,尽管一些 Level 1 和 Level 2 的对象、属性和方法在所有浏览器中已经存在了一段时间。DOM 标准中的许多内容最近才得到明确,很多 DOM 特性和支持仅添加到了最新版本的浏览器中。所以,本章的示例仅保证在 IE、Firefox、Opera、Safari 和 Chrome 的最新版本中正常工作。虽然跨浏览器脚本是一个现实目标,但向后兼容支持目前还无法实现。
#### 5. DOM 与 BOM 的区别
- **覆盖范围不同**:DOM 仅涵盖网页的文档部分,而 BOM 提供对浏览器所有区域(从按钮到标题栏,包括页面的某些部分)的脚本访问。
- **特定于浏览器**:BOM 是特定于某个浏览器的,因为浏览器需要提供有竞争力的功能,所以无法对其进行标准化。因此,需要不同的属性、方法甚至对象来使用 JavaScript 对其进行操作。
#### 6. 将 HTML 文档表示为树结构
由于 HTML 是标准化的,网页只能包含该语言支持的标准特性(如表单、表格、图像等),因此需要一种通用的方法来访问这些特性,DOM 应运而生。它通过将整个 HTML 文档/网页表示为树结构,提供了对 HTML 文档的统一表示。要将 HTML 文档表示为树结构,文档必须格式良好。不同浏览器对未闭合标签或 HTML 表单控件未包含在 `<form/>` 元素内等问题的容忍程度不同,但为了准确描绘 HTML 文档的结构,必须能够始终预测文档的结构。像未闭合标签这样的结构滥用会阻止将结构描绘为真正的层次结构,因此是不允许的。通过 DOM 访问元素的能力取决于将页面表示为层次结构的能力。
##### 树结构示例
以下是一个简单的 HTML 页面及其对应的树结构示例:
```html
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
</head>
<body>
<h1>My Heading</h1>
<p>This is some text in a paragraph.</p>
</body>
</html>
```
对应的树结构如下:
```mermaid
graph TD;
HTML --> HEAD;
HTML --> BODY;
BODY --> H1;
H1 --> "My Heading";
BODY --> P;
P --> "This is some text in a paragraph.";
```
#### 7. 核心 DOM 对象
##### 7.1 基础 DOM 对象
| 对象 | 描述 |
| ---- | ---- |
| Node | 文档中的每个节点都有自己的 Node 对象 |
| NodeList | 这是 Node 对象的列表 |
| NamedNodeMap | 它通过名称而非索引访问所有 Node 对象 |
与 BOM 对象不同,BOM 对象的名称与浏览器的特定部分相关(如窗口对象、表单和图像集合),而 DOM 为了以树的形式导航网页,使用抽象的方式,一切最终都只是一个节点。要在 HTML 元素之间、元素与属性之间移动,必须从一个节点移动到另一个节点,这样可以在不影响整体结构的情况下添加、替换或删除网页的部分内容。
##### 7.2 高级 DOM 对象
由于 DOM 中的一切都是节点,节点有多种类型,如元素、属性或纯文本。Node 对象有不同的对象来表示每种可能的节点类型,以下是可通过 DOM 访问的所有不同节点类型对象的完整列表:
| 对象 | 描述 |
| ---- | ---- |
| Document | 文档的根节点 |
| DocumentType | XML 文档的 DTD 或模式类型 |
| DocumentFragment | 文档部分的临时存储空间 |
| EntityReference | XML 文档中实体的引用 |
| Element | 文档中的元素 |
| Attr | 元素的属性 |
| ProcessingInstruction | 处理指令 |
| Comment | XML 文档或 HTML 文档中的注释 |
| Text | 必须构成元素子节点的文本 |
| CDATASection | XML 文档中的 CDATA 部分 |
| Entity | DTD 中未解析的实体 |
| Notation | DTD 中声明的符号 |
虽然本章不会详细介绍其中大部分对象,但在导航 XML 文档的 DOM 时,可能需要使用它们。每个对象都继承了 Node 对象的所有属性和方法,同时也有自己的一些属性和方法。
#### 8. DOM 对象及其属性和方法
为了更实际地使用 DOM,我们将重点关注三个对象:Node 对象、Element 对象和 Document 对象。
##### 8.1 Document 对象及其方法
Document 对象的方法对于脚本编写者非常重要,它允许查找单个或多个元素,以及创建新的元素、属性和文本节点。
- **查找元素**
- `getElementById(idValue)`:当提供元素的 id 属性值时,返回对该元素的引用(一个节点)。例如:
```html
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<title>example</title>
</head>
<body>
<h1 id=”heading1”>My Heading</h1>
<p id=”paragraph1”>This is some text in a paragraph</p>
<script type=”text/javascript”>
var h1Element = document.getElementById(“heading1”);
h1Element.style.color = “red”;
</script>
</body>
</html>
```
- `getE
0
0
复制全文
相关推荐










