DOM(文档对象模型)是一个独立于JavaScript语言的,使用XML和HTML文档操作的应用程序接口(API)。在浏览器中,DOM主要与HTML文档打交道,因此在网页应用中检索XML文档也很常见。虽然DOM是与语言无关的API,但是浏览器中的接口却是以JavaScript实现的。客户端大多数脚本程序与文档打交道,因此DOM就成为JavaScript代码日常行为中重要的组成部分。浏览器通常要求DOM实现和JavaScript实现保持相互独立。例如,在IE中,被称为JScript的JavaScript实现位于库文件jscript.dll中,而DOM实现位于另一个库文件mshtml.dll中。
这种分离技术为其他技术和语言提供了准入接口。Safari使用WebKit的WebCore处理DOM和渲染,具有一个分离的JavascriptCore引擎(最新版本的绰号是SquirrelFish)。Google Chrome也使用WebKit的WebCore库渲染页面,却实现了自己的JavaScript引擎V8。在Firefox中,JavaScript实现采用Spider-Monkey(最新版是TraceMonkey),与其Gecko渲染引擎相分离。
对DOM操作代价很高,在富网页应用中通常是一个性能瓶颈。两个独立的部分以功能接口连接就会带来性能损耗。我们可以把DOM看成一个岛屿,把JavaScript(ECMAScript)看成另一个岛屿,两者之间通过一座桥连接。每次ECMAScript需要过桥访问DOM时,都会带来一定的性能损耗。操作DOM次数越多,损耗越大。一般的建议是尽量减少这种过桥操作次数,努力停留在ECMAScript岛上。
建议106:建议先检测浏览器对DOM支持程度
W3C制定的DOM规范包括多个版本,不同版本(或称级别)又包含不同的子规范和模块,不同浏览器对DOM支持是千差万别的。另外,DOM不同版本之间可能会存在个别不兼容的规定,这一点需要特别留意。
(1)DOM 0级
在W3C推出DOM标准之前,市场已经流行了几个版本不太一致的DHTML规范,主要包括IE和Netscape两个不同版本。这组DHTML规范规定了一套文档对象、集合、方法和属性,虽然不同版本DHTML规范的特性存在很大差异,但是一些基本思路和用法还是有章可循的,如事件处理函数、脚本化样式、文档基本结构对象等。
(2)DOM 1级
1998年10月,W3C推出了DOM 1.0版本规范(http://www.w3.org/DOM/DOMTR.html#dom1),主要包括两个子规范。
❑DOM Core(核心部分):把XML文档设计为树形节点结构,并为这种结构的运行机制制定了一套规范化标准,同时定义了创建、编辑、操纵这些文档结构的基本属性和方法。
❑DOM HTML:针对HTML文档、标签集合,以及与个别HTML标签相关的元素定义了对象、属性和方法。
(3)DOM 2级
2000年11月,W3C正式发布了更新后的DOM核心部分,并在这次发布中添加了一些新规范,这次发布的DOM称为2级规范。
2003年1月,W3C又正式发布了对DOM HTML子规范的修订,添加了针对HTML 4.01和XHTML 1.0版本文档中的很多对象、属性和方法。W3C把新修订的DOM规范统称为DOM 2.0推荐版本(http://www.w3.org/DOM/DOMTR.html#dom2),该版本主要包括6个推荐子规范。
❑DOM2 Core:继承于DOM Core子规范,系统规定了DOM文档结构模型,添加了更多的特性,如针对命名空间的方法等(参阅http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/changes.html)。
❑DOM2 HTML:继承于DOM HTML,系统规定了针对HTML的文档结构模型,并添加了一些属性(参阅http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/changes.html)。
❑DOM2 Events:规定了与鼠标相关的事件(包括目标、捕获、冒泡和取消)的控制机制,但不包含与键盘相关事件的处理部分。
❑DOM2 Style(或DOM2 CSS):提供了访问和操纵所有与CSS相关的样式及规则的能力。
❑DOM2 Traversal和DOM2 Range:这两个规范允许开发人员通过迭代方式访问DOM,以便根据需要对文档进行遍历或其他操作。
❑DOM2 Views:提供了访问和更新文档表现的能力。
DOM 2级规范已经成为目前各大浏览器支持的主流标准,但IE对于该规范的支持不尽完善,特别是在对DOM2 Traversal和DOM2 Range的支持上。
(4)DOM 3级
2004年4月,W3C发布了DOM 3.0版本(http://www.w3.org/DOM/DOMTR.html#dom3)。DOM 3级版本主要包括以下3个推荐子规范。
❑DOM3 Core:继承于DOM2 Core,并添加了更多的新方法和新属性,同时也修改了已有的一些方法(参阅http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/changes.html)。
❑DOM3 Load and Save:提供将XML文档的内容加载到DOM文档中和将DOM文档序列化为XML文档的能力。
❑DOM3 Validation:提供了确保动态生成的文档的有效性的能力,即如何符合文档类型声明。
为了能够检测不同类型浏览器及各个版本对DOM规范的支持程度,可以调用DOMImplementation对象,该对象被DOM核心规范规定,通过document对象的implementation属性来调用。如果浏览器支持DOM某个特性,那么可以通过implementation对象的hasFeature方法来检测。检测代码如下:
var dom=/"HTML/";//指定DOM模块
var ver=/"1.0/";//指定DOM级别
if(document.implementation){//如果浏览器支持implementation对象,则进行测试
if(document.implementation.hasFeature(dom,ver)){//检测对指定DOM模块及版本的支持情况
alert(/"支持:n/"+dom+/"/"+ver);
}
else{
alert(/"不支持:n/"+dom+/"/"+ver);
}
}
else{
alert(/"不支持:n DOMImplementation对象/");
}
如果浏览器中不存在document.implementation对象,那么基本可以确定它不支持DOM,不过也可能部分支持,如IE 6.0支持HTML,而不支持Core,但为了支持HTML,自然会支持DOM核心的某些部分,因为HTML需要核心方法。
hasFeature方法包含两个参数,第一个参数用来指定DOM模块的名称,第二个参数指定模块的级别,包括1、2、3,所有参数都以字符串的形式进行传递。
访问http://www.w3.org/2003/02/06-dom-support.html,页面会自动显示当前浏览器版本所支持的模块。其中“N/A”表示某个模块在某个级别下是不适用的,即还没有开发或推荐标准。如果显示白色背景,提示信息为“supported”,则表示支持这个级别的模块。如果显示红色背景,提示这个级别版本的发布时间,则说明当前浏览器版本不支持这个模块。
访问http://www.w3.org/DOM/Test/,对DOM规范中每一个模块的个别部分进行更具体的测试。这种测试的时间稍长,但会检测每个对象的每个方法,因而可以检测出哪些方法符合规范。