介绍
文档对象模型(DOM)是一个用于HTML和XML文档的应用程序编程接口(API)。它定义了文档的逻辑结构以及访问和操作文档的方式。在规范中,术语 “文档”则越来越多的用在广义上, XML被用作表示许多不同类型的信息的一种方式,这些信息可能存储在不同的系统中,而其中的大部分将被看作是数据而不是文档。尽管如此,XML将这些数据作为文档呈现,并且可以使用DOM来管理这些数据。
编者注:DOM是啥?这个不好说。通俗的讲,它就是暴露给程序员编程的接口(就像是JAVA API)。它将整个文档抽象为逻辑上的对象,然后定义了访问和操作这些文档的方法(API)。另外,不得不说这里的文档所指的就是XML和HTML文档(虽然通常XML文档经常被当做数据存储,而非文档来查阅)。
使用文档对象模型(DOM),程序员可以构建文档、导航其结构以及添加、修改或删除元素和内容。在HTML或XML文档中找到的任何东西都可以使用文档对象模型访问、更改、删除或添加,除了少数例外,对于XML内部和外部子集的DOM接口还没有指定。
编者注:这里主要说说DOM给我们提供的能力,这么说吧,只要是在文档中能够找到的,我们DOM就有能力访问操作它。是不是很牛叉~
作为一个W3C规范,文档对象模型的一个重要目标是提供一个可用于各种环境和应用程序的标准编程接口。DOM 被设计为可以与任何编程语言一起使用。为了提供精确的、语言无关的DOM接口规范,我们选择了在OMG IDL中定义该规范,这是在2.2规范中定义的。除了在OMG IDL定义规范外,我们还为Java和ECMAScript (基于JavaScript和JScript的行业标准脚本语言)提供语言绑定。注意:OMG IDL只是作为一种语言无关和实现中立的方式来指定接口。其他的IDLs可能已经被使用了。一般来说,IDLs是为特定的计算环境设计的。文档对象模型可以在任何计算环境中实现,并且不要求对象绑定运行时具有这样的IDLs。
编者注:作为一份规范文件,就要有规范的样子,不能偏向谁。所以,DOM的制定规则就是要独立于任何平台和语言,为此,我们使用IDL来定义该规范。当然我们也提供了那么一两种语言的绑定,至于为什么这么干,我想我有权利保持沉默~
文档对象模型是什么
DOM是文档的编程API,它非常类似于它所模拟的文档的结构。例如,请考虑从一个html文档中获取的这个表:

DOM像这样的方式标示此表:

在DOM中,文档的逻辑结构非常类似于树;更精确地说,它就像一个“树林”,它可以包含多个树。然而,DOM并没有指定这些文档必须以树的形式实现。它也没有指定如何实现对象之间的关系。DOM是一个逻辑模型,可以以任何方便的方式实现。在这个规范中,我们使用术语结构模型(structure model)来描述文档的树型表示;我们特别避免使用诸如“树”或“小树林”这样的术语,以避免暗示某个特定的实现。DOM 结构模型的一个重要属性是结构同构(structural isomorphism):如果有两个文档对象模型实现用于创建同一文档的表示,则它们将创建相同的结构模型,其中包含相同的对象和关系。
选择“文档对象模型”是因为它是传统面向对象设计意义上的“对象模型”:文档是用对象建模的,而模型不仅包含文档的结构。也包括文档的行为和它所组成的对象。换句话说,上面的图中的节点不代表数据结构,它们表示对象,它们具有函数和属性。作为对象模型,DOM具有以下特性:
用于表示和操作文档的接口和对象
这些接口和对象的语义-包括行为和属性
这些接口和对象之间的关系和协作
传统上,SGML文档的结构是由抽象数据模型表示的,而不是对象模型。在抽象数据模型中,模型以数据为中心。在面向对象的编程语言中,数据本身被封装在隐藏数据的对象中,保护数据不受直接外部操作的影响。与这些对象相关联的函数决定了对象是如何被操作的,它们是对象模型的一部分。
文档对象模型目前由两部分组成, DOM 核心 和 DOM HTML。Dom Core 表示用于XML文档的功能,也是HTML DOM 的基础。一个兼容的DOM实现必须使用定义的语义来实现核心章节中的所有基本接口。此外,它必须使用定义的语义实现至少一个HTML DOM和扩展(XML)接口。
文档对象模型不是什么
本节旨在通过将它与其他可能类似于它的系统区分出来,使其更精确地理解DOM。
虽然文档对象模型受到“动态html”的强烈影响,但在第1级,它并不实现所有的“动态的html”。特别是,事件尚未确定。第一级的设计是为了为这种功能奠定坚实的基础,它提供了一个健壮的、灵活的文档本身模型。
文档对象模型不是二进制规范。用同一种语言编写的DOM程序将是跨平台兼容的源代码,但是DOM没有定义任何形式的二进制互操作性。
文档对象模型不是将对象持久化到xml或html中的一种方式。DOM没有指定如何用xml表示对象,而是指定如何将xml和html文档表示为对象,以便它们可以用于面向对象的程序。
文档对象模型不是一组数据结构,而是指定接口的对象模型。虽然此文档包含了显示父/子关系的图表,但这些关系是由编程接口定义的逻辑关系,而不是任何特定内部数据结构的表示。
文档对象模型没有定义xml或html的“真正的内部语义”。这些语言的语义是由这些语言的W3C建议定义的。是一个编程模型,旨在尊重这些语义。对于编写xml和html文档的方式,在没有任何影响;可以用这些语言编写的任何文档都可以在DOM中表示。
文档对象模型(尽管如此命名)并不是组件对象模型(COM)的竞争对手。 COM, 就像CORBA, 是一种语言独立的方式来指定接口和对象; DOM是一组用于管理html和xml文档的接口和对象。可以使用独立于语言的系统(如COM或CORBA)来实现DOM;它也可以使用特定于语言的绑定来实现,比如在本文档中指定的在或EcmaScript。
文档对象模型来自于
DOM 最初是一种规范,它允许在浏览器中使用JavaScript脚本和java程序。 “动态HTML”是文档对象模型的直接祖先,它最初被认为主要是在浏览器方面。然而,当DOM工作组在W3C成立时,其他领域的供应商也加入了它,包括html或xml编辑者和文档存储库。 这些供应商中有几个在开发xml之前就使用了SGML;因此,DOM 受到了SGML和HyTime标准的影响。其中一些供应商还为文档开发了自己的对象模型,以便为SGML/xml编辑者或文档存储库提供一个API,这些对象模型也影响了DOM。
实体和DOM核心
在基本的DOM接口中,没有表示实体的对象。数字字符引用,以及对HTML和XML中预定义实体的引用,被构成实体替换的单个字符所取代。例如,在:

"&" 将被字符“&”替换,P元素中的文本将形成一个连续的字符序列。由于数字字符引用和预定义的实体在CDATA节中不被识别,或者HTML中的脚本和样式元素不被识别,它们不会被它们所引用的单个字符所取代。如果上面的例子被包含在CDATA部分中,“& amp;“不会被”“&”取代也不会将< p >作为开始标记。一般实体的表示,包括内部的和外部的,都是在一级规范的扩展(XML)接口中定义的。
注意:当文档的DOM表示被序列化为XML或HTML文本时,应用程序需要检查文本数据中的每个字符,以查看是否需要使用数字或预定义的实体来转义。如果不这样做,可能会导致无效的HTML或XML。此外,实现应该意识到,如果没有在编码中出现的标记或CDATA部分中有字符,那么没有完全覆盖ISO 10646的字符编码(“charset”)的序列化可能会失败。
DOM接口和DOM实现
DOM指定的接口可用于管理XML或HTML文档。重要的是要认识到这些接口是抽象的——就像c++中的“抽象基类”,它们是一种指定访问和操作应用程序内部表示文档的方法。接口并不意味着具体的实现。每个DOM应用程序可以以任何方便的表示来自由地维护文档,只要支持该规范中所示的接口。一些DOM实现将是在DOM规范存在之前使用DOM接口访问软件的现有程序。因此,DOM的设计是为了避免实现依赖;特别是,
在IDL中定义的属性并不意味着具体对象必须有特定的数据成员——在语言绑定,它们被翻译成一对get()/ set()函数,而不是数据成员。(只读函数在语言中只有一个get()函数绑定)。
DOM应用程序可能提供在这个规范中没有找到的附加接口和对象,仍然被认为是DOM兼容的。
因为我们指定的是接口,而不是要创建的实际对象,所以DOM不知道为实现调用什么构造函数。通常,DOM用户调用文档类上的createXXX()方法来创建文档结构,而DOM实现在他们的createXXX()函数的实现中创建它们自己的这些结构的内部表示。
DOM Level 1 的局限性
DOM Level 1规范有意只局限于那些用来表示和操作文档结构和内容的方法。该计划是为将来的DOM规范级别提供:
内部子集和外部子集的结构模型。
验证模式。
通过样式表控制呈现文档。
访问控制。
线程安全。
事件。
网友评论