本文为译文,点击 此处查看原文。
文档对象模型(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.inputName
或document.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)相关联。其他的布局引擎,包括Blink
、WebKit
和Gecko
,由许多浏览器共享,如谷歌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:
检验工具:
- DOM Inspector是一个web开发工具
5. 参考文献
- All versioning refers to W3C DOM only.
- “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.
- “DOM Standard”. Retrieved 23 September 2016.
- “W3C Document Object Model”. Retrieved 23 September 2016.
- (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.
- “PubStatus - WEBAPPS”. Retrieved 23 September 2016.
- “W3C DOM4”. Retrieved 23 September 2016.
- "A Survey of Techniques for Improving Efficiency of Mobile Web Browsing", Concurrency and Computation, 2018
- “JavaScript HTML DOM”. Retrieved 23 September 2016.
- “XML for <SCRIPT> Cross Platform XML Parser in JavaScript”. Retrieved 23 September 2016.
- “The modern DOM API for PHP 7 projects”.