DOM1级主要定义的是 HTML 和 XML 文档的底层结构。DOM2 和 DOM3 级则在这个结构的基础上引入了更多的交互能力,也支持了更高级的 XML 特性。为此,DOM2 和 DOM3 级分为许多模块 (模块之间具有某种关联),分别描述了 DOM 的某个非常具体的子集。这些模块如下:
- DOM2级核心 (DOM Level 2 Core): 在1级核心基础上构建,为节点添加了更多方法和属性;
- DOM2级视图 (DOM Level 2 Views): 为文档定义了基于样式信息的不同视图;
- DOM2级事件 (DOM Level 2 Events): 说明了如何使用事件与 DOM 文档交互;
- DOM2级样式 (DOM Level 2 Style): 定义了如何以编程方式来访问和改变 CSS 样式信息;
- DOM2级遍历和范围 (DOM Level 2 Traversal and Range): 引入了遍历 DOM 文档和选择其特定部分的新接口;
- DOM2级HTML (DOM Level 2 HTML): 在1级HTML基础上构建,添加了更多属性、方法和新接口。
本章探讨除 "DOM 2级事件" 之外的所有模块,“DOM2级事件” 模块将在第12章进行全面讲解。
DOM3级又增加了 "XPath" 模块和 "加载与保存" (Load and Save) 模块。这些模块将在第15章讨论。
11.1 DOM 变化
DOM2级和3级的目的在于扩展DOM API,以满足操作XML的所有需求,同时提供更好的错误处理及特性检测能力。从某种意义上讲,实现这一目的很大程度意味着对命名空间的支持。
"DOM2级核心" 没有引入新类型,它只是在 DOM1级的基础上通过增加新方法和新属性来增强了既有类型。“DOM3级核心”同样增强了既有类型,但也引入了一些新类型。
类似地,"DOM2级视图" 和 “DOM2级HTML”模块也增强了DOM接口,提供了新的属性和方法。由于这两个模块很小,因此我们将把它们与 "DOM2级核心"放在一起,讨论基本 JavaScript 对象的变化。可以通过下列代码来确定浏览器是否支持这些 DOM 模块:
var supportsDOM2Core = document.implementation.hasFeature("Core", "2.0");
var supportsDOM3Core = document.implementation.hasFeature("Core", "3.0");
var supportsDOM2HTML = document.implementation.hasFeature("HTML", "2.0");
var supportsDO2Views = document.implementation.hasFeature("Views", "2.0");
var supportsDOM2XML = document.implementation.hasFeature("XML", "2.0");
IE不支持任何 DOM2 和 DOM3 级模块。其他浏览器的支持情况也各异。本章只讨论那些已经有浏览器实现的部分,任何浏览器都没有实现的部分将不作讨论。
11.1.2 其他方面的变化
2.Document 类型的变化
“DOM2级视图” 模块添加了一个名为 defaultView 属性,其中保存着一个指针,指向拥有给定文档的窗口 (或框架)。除此之外,"视图" 规范没有提供什么其他可用的信息,因而这是唯一一个新增的属性。除IE之外的所有浏览器都支持 defaultView 属性。在 IE 中有一个等价的属性名叫 parentWindow (Opera 也支持这个属性)。因此,要明确文档的归属窗口,可以使用以下代码:
var parentWindow = document.defaultView || document.parentWindow;
4.框架的变化
框架和内嵌框架分别用 HTMLFrameElement 和 HTMLIFrameElement 表示,它们在 DOM2级中都有了一个新属性,名叫 contentDocument 。这个属性包含一个指针,指向表示框架内容的文档对象。在此之前,无法直接通过元素取得这个文档对象 (只能使用 frames 集合)。可以像下面这样使用这个属性:
var iframe = document.getElementById("myIframe");
var iframeDoc = iframe.contentDocument;
// 在 IE 中无效
由于 contentDocument 属性是 Document 类型的实例,因此可以像使用其他 HTML 文档一样使用它,包括所有属性和方法。Opera、Firefox、Safari 和 Chrome 支持这个属性。
IE8之前不支持框架中的 contentDocument 属性,但支持一个名叫 contentWindow 的属性,该属性返回框架的 window 对象,而这个 window 对象又有一个 document 属性。因此,要想在上述所有浏览器中访问内嵌框架的文档对象,可以使用下列代码:
var iframe = document.getElementById("myIframe");
var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
所有浏览器都支持 contentWindow 属性。
访问框架或内嵌框架的文档对象要受到跨域安全策略的限制。如果每个框架中的页面来自其他域或不同子域,或者使用了不同的协议,那么要访问这个框架的文档对象就会导致错误。