DOM(Document Object Model,文档对象模型)


本文为译文,点击 此处查看原文。
文档对象模型(DOM)是一个跨平台的、独立于语言的应用程序编程接口,它将XML文档视为树结构,其中每个节点都是表示文档一部分的对象。DOM表示具有逻辑树的文档。树的每个分支都以一个节点结束,每个节点都包含对象。DOM方法允许对树进行编程访问;使用它们可以更改文档的结构、样式或内容。节点可以附加事件处理程序。一旦事件被触发,事件处理程序就会被执行[2]。
DOM的主要标准化是由万维网联盟(World Wide Web Consortium)负责的,该联盟最后一次提出建议是在2004年。WHATWG接手了标准的开发工作,并将其作为活文档发布。W3C现在发布WHATWG标准的稳定快照。

1. 历史

文档对象模型的历史与1990年代末Netscape Navigator之间和微软IE浏览器“浏览器战争”的历史交织在一起,以及JavaScript和JScript,在web浏览器的JavaScript引擎中广泛实现的第一种脚本语言。

JavaScript由Netscape Communications于1995年在Netscape Navigator 2.0中发布。网景(Netscape)的竞争对手微软(Microsoft)在第二年发布了Internet Explorer 3.0,重新实现了一种JavaScript称为JScript。JavaScript和JScript允许web开发人员创建具有客户端交互性的web页面。在这些语言的第一代中,用于检测用户生成的事件和修改HTML文档的有限工具最终被称为“DOM Level 0”或“Legacy DOM”。没有为DOM Level 0开发独立的标准,但是在HTML 4规范中有部分描述。
Legacy DOM在可访问的元素种类上受到限制。表单、链接和图像元素可以使用以根文档对象开头的层次结构名称引用。层次结构名称可以使用遍历元素的名称或顺序索引。例如,可以通过document.formName.inputNamedocument.forms[0].elements[0]访问form input元素
Legacy DOM启用了客户端表单验证和流行的“滚动”效果。

1997年,Netscape和Microsoft分别发布了Netscape Navigator和Internet Explorer的4.0版本,增加了对动态HTML (DHTML)功能的支持,支持对加载的HTML文档进行更改。DHTML要求对 Legacy DOM 实现中可用的基本文档对象进行扩展。虽然由于JScript是基于JavaScript的,所以 Legacy DOM 实现在很大程度上是兼容的,但是 DHTML DOM 扩展是由每个浏览器制造商并行开发的,并且仍然是不兼容的。这些版本的DOM被称为“中间DOM(Intermediate DOM)”。

ECMAScript标准化之后,W3C DOM工作组开始起草标准DOM规范。完整的规范称为“DOM Level 1”,在1998年末成为W3C的推荐标准。到2005年,大部分支持ECMAScript的浏览器都很好地支持W3C DOM,包括Microsoft Internet Explorer version 6(2001年起)、Opera、Safari和基于gecko的浏览器(如Mozilla、Firefox、SeaMonkey和Camino)。

2. 标准

W3C DOM工作组发布了最终的建议,并于2004年解散。开发工作转移到了WHATWG,它继续维持一个生活标准[3]。2009年,Web应用程序组在W3C重新组织了DOM活动[4]。在2013年,由于缺乏进展和HTML5即将发布,DOM Level 4规范被重新分配到HTML工作组,以加快其完成[5]。与此同时,在2015年,Web应用程序组被解散,DOM管理工作移交给了Web平台组[6]。从2015年DOM Level 4发布开始,W3C就基于WHATWG标准的快照创建了新的推荐。

  • DOM Level 1为整个HTML或XML文档提供了一个完整的模型,包括更改文档任何部分的方法。
  • DOM Level 2于2000年末发布。它引入了getElementById函数、事件模型以及对XML名称空间CSS的支持。
  • DOM Level 3于2004年4月发布,它增加了对XPath和键盘事件处理的支持,以及将文档序列化为XML的接口。
  • DOM Level 4于2015年发布。这是WHATWG活动标准的一个缩影[7]。

3. 应用程序

3.1 Web浏览器

要呈现诸如HTML页面之类的文档,大多数web浏览器使用类似于DOM的一种内部模型。每个文档的节点都组织在一个树结构中,称为DOM树,最上面的节点称为“document object”。当HTML页面在浏览器中呈现时,浏览器将HTML下载到本地内存中,并自动解析它以在屏幕上显示该页面[8]。

3.2 JavaScript

当加载一个web页面时,浏览器创建这个页面的文档对象模型,这是HTML文档的面向对象表示,充当JavaScript和文档本身之间的接口,并允许动态web页面的创建[9]:

  • JavaScript可以添加、更改和删除页面中的所有HTML元素和属性。
  • JavaScript可以改变页面中的所有CSS样式。
  • JavaScript可以对页面中所有现有事件作出响应。
  • JavaScript可以在页面中创建新的事件。

4. 实现

因为DOM支持任何方向的导航(例如父节点和前一个兄弟节点),并且允许任意修改,所以实现必须至少缓存到目前为止读取的文档(或者它的某种解析形式)。

4.1 布局引擎(Layout engines)

参见:布局引擎的比较(文档对象模型)
Web浏览器依赖于布局引擎将HTML解析为DOM。一些布局引擎(如Trident/MSHTML)主要或完全与特定的浏览器(如Internet Explorer)相关联。其他的布局引擎,包括BlinkWebKitGecko,由许多浏览器共享,如谷歌Chrome、Opera、Safari和Firefox。不同的布局引擎在不同程度上实现了DOM标准。

4.2 库

DOM实现:

  • libxml2
  • MSXML
  • Xerces是用C++、Java 和 Perl 编写的DOM实现的集合
  • xml for<script>是基于JavaScript的DOM实现[10]
  • PHP.Gt DOM基于libxml2,并将DOM Level 4兼容性[11]引入到PHP编程语言中。
  • Domino是基于Mozilla的dom.js的服务器端(Node.js) DOM实现。Domino在Mediawiki堆栈中与Visual Editor一起使用。

公开DOM实现的APIs:

  • JAXP(Java API for XML处理)是访问DOM提供者的一个API
  • Lazarus(Free Pascal IDE)包含两种不同的DOM变体 —— 带有 UTF-8 和 ANSI 格式

检验工具:

5. 参考文献

  1. All versioning refers to W3C DOM only.
  2. “Document Object Model (DOM)”. http://www.w3.org/: W3C. Retrieved 2012-01-12. The Document Object Model is a platform- and language-neutral interface that will allow programs and scripts to dynamically access and update the content, structure and style of documents.
  3. “DOM Standard”. Retrieved 23 September 2016.
  4. “W3C Document Object Model”. Retrieved 23 September 2016.
  5. (plh@w3.org), Philippe Le Hegaret. “New Charter for the HTML Working Group from Philippe Le Hegaret on 2013-09-30 (public-html-admin@w3.org from September 2013)”. Retrieved 23 September 2016.
  6. PubStatus - WEBAPPS”. Retrieved 23 September 2016.
  7. “W3C DOM4”. Retrieved 23 September 2016.
  8. "A Survey of Techniques for Improving Efficiency of Mobile Web Browsing", Concurrency and Computation, 2018
  9. JavaScript HTML DOM”. Retrieved 23 September 2016.
  10. XML for <SCRIPT> Cross Platform XML Parser in JavaScript”. Retrieved 23 September 2016.
  11. The modern DOM API for PHP 7 projects”.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值