Dom 概览

前言

我们已经接触并使用了很多api去操作html文档,例如:appendChild,getElementById, 等等。但是,每当我在浏览器输入document,window 按下回车,会发现还有好多api不会使用。感觉自己在一个海洋里,找不到边界,有点茫然失措。
试想其原因,可能是,我一接触js编程时。就会被教着使用getElementById获取一个元素,使用removeChild删除一个元素等等。没有时间去思考事情的宏观,全貌。会完全沉浸在使用这些api的业务逻辑当中。那么解决这个问题,应该从宏观出发,搞清楚我们正在使用的这些api到底是谁,属于谁。

事情原本很简单,我们在面对任何一个新的事物的时候,都会自然的去想,这个东西是干什么的。 你只有知道这个是干什么的,有个整体的映象,在接下来使用的过程中才不会盲人摸象

上帝说要有光,那么就有了光。 这其实是个很难的问题,上帝为什么知道应该有光,这需要大智慧的。 所以任何规范的制定者都应该受到尊重。 在软件行业里,我们的需求文档就是一个规范。它是来解决应该有什么的问题, 比起实现来,她重要的多的多。DOM就是一个规范

DOM

下定义

Document Object Model 是 HTML,XML.SVG 文档的编程接口规范。它把文档呈现成结构化的树结构。DOM 定义了操作树的方法,以便这些方法能改变树的结构,样式和内容。它把以上的文档类型描述成结构化的节点(Node)和对象(Object),这些节点和对象拥有多样的属性和方法。节点(Nodes)也具备事件处理能力。一旦事件触发,他们对应的节点处理程序将会被执行。实际上,DOM 联系着web 页面和scripts 或者其他的编程语言。
尽管DOM 常常被javascript操作,但并不是JavaScript的一部分,DOM也可以被其他任何编程操作

一个XML文档及其所对应的DOM树,如下:

<?xml version="1.0" encoding="utf-8"?>

<bookstore>
    <book category="children">
          <title lang="en">Harry Potter</title> 
          <author>J K. Rowling</author> 
          <year>2005</year> 
          <price>29.99</price> 
    </book>

    <book category="cooking">
          <title lang="en">Everyday Italian</title> 
          <author>Giada De Laurentiis</author> 
          <year>2005</year> 
          <price>30.00</price> 
    </book>

    <book category="web">
          <title lang="en">Learning XML</title> 
          <author>Erik T. Ray</author> 
          <year>2003</year> 
          <price>39.95</price> 
    </book>

    <book category="web">
          <title lang="en">XQuery Kick Start</title> 
          <author>James McGovern</author> 
          <author>Per Bothner</author> 
          <author>Kurt Cagle</author> 
          <author>James Linn</author> 
         <author>Vaidyanathan Nagarajan</author> 
          <year>2003</year> 
          <price>49.99</price> 
    </book>

</bookstore>

 

DOM分类

按照操作对象的不同,可分为Core DOM、XML DOM 和 HTML DOM。

Core Dom:核心Dom,针对任何结构化文档的标准模型。

XML DOM:用于XML文档的标准模型,对XML元素进行操作。

HTML DOM: 用于HTML文档的标准模型,对HTML元素进行操作。

 DOM历史版本

W3C标准化组织定义了一系列DOM接口,随着时间的发展,目前包括DOM Level 1 2 3。每一个新版本是对以前版本的补充和新功能加入。

DOM level 11. core:一组底层的接口,其接口可以表示任何结构化的文档,同时也允许对齐进行扩展,典型的例子是支持xml Dom
2. html:一组基于Core 定义的接口的上层接口。主要是为了方便HTML 文档的访问。
DOM level 21. core: 对DOM level 1中core 部分进行扩展,其中著名的就是getElementById ,还有很多跟命名空间(namespace)的接口
2. views:允许动态访问和修改文档内容的表示,主要是两个接口AbstractView 和 DocumentView
3. Events:主要有EventTarget,MouseEvents接口,但不支持keyboard
4. Style(Css):加入可以修改样式属性的接口
5. Traversal and range: NodeIterator 和 TreeWalker
6. 允许动态访问,修改HTML文档

Dom level 3:
1. core :加入了新的adoptNode() 和textContent支持
2. Load And Save: 动态加载和序列化DOM表示
3. validation:根据scheme 验证文档的有效性
4. Events:keyboard的支持,
5. XPath: 是用XPath1.0来访问DOM树,XPath是一种简单直观的检索DOM树节点的方式

 Html Dom 

我们日常工作的时候,都跟 HTML 文档打交道,其实就是属于 W3C 所规定的 DOM Level 1 HTML 模块内的范畴。HTML DOM 的特性和方法不是标准的 DOM 实现,而是是专门针对 HTML 而设的,同时也考虑到使得 DOM 操作变的更为简便。HTML 模块集中表现在 HTMLElement 接口上,即为全体元素类型的对象所实现的接口。就该文讨论的范围而言,HTMLElement 接口的参与形式与上述的 Node 节点接口非常地相似。一旦引入了 OO 设计观,只要实现了 HTMLElement 接口的对象,就可以定义它为元素了。一份 HTML 文档有相当多的都是元素,当然还有,表示文档本身的 HTMLDocument 和集合容器 HTMLCollection 等等。

因此,要准确理解 DOM 1 HTML 的模块,必须认识其接口是基于元素的(Element-based),而不是基于节点的(Node-based)。那样的话,元素方式与节点方式到底又有什么区别呢(Element v.s Node),应该如何界定两者呢?例如节点属性(properties of elements),当在“基于元素”的语境中,就是“属性(attributes)”,并非独立的节点对象。——尽管按照某个角度讲,元素是节点的一种特例,我们仍可保留“节点”这一说法,一个标签(tag)便是一个 “节点”。假如我们要得到 id 属性的字符串的值是什么,采用DOM 1 Core 的方式就是,

 

Core or HTML Module?

既然这样,那我应该使用 Core 的 API,还是 HTML 模块的 API?对于 HTML 的文档来说,用 Core 或 HTML Module 实际差别不大。本来我们一直都不太强调这种界定,以致忽略了它们细微的差异。如果我们觉得还是模棱两可的话,我们可进一步查探它们的明细。个人认为处理 XHTML 并使用 Core API 这样更能够说明 XHTML 中的 “X”,即表明这份 HTML 就是一份标准的 XML 文档,以便与原有 HTML 4.1 从语义上区别开来。但请记住,当处理一份 XML 结构的文档的时候,自然而然就是采用 Core 去处理。通过XHMLHttpRequest 请求执行后所返回的 responseXML 结果对象,那只能使用 Core 的 API 去处理分析,就不能够采用 HTML 的了。

 W3C 与 WhatWg

他们两个吵架,然后Whatwg赢了。html5诞生了。但是w3c的卓越贡献将永存。
whatwg 的Dom 官网 https://dom.spec.whatwg.org/ 

 

搞清楚以上的内容,从头梳理下dom的api。查缺补漏。 资料:https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model

dom core level3  文档 http://www.w3school.com.cn/xmldom/index.asp

posted @ 2017-01-07 15:18  btg.yoyo  阅读(253)  评论(0编辑  收藏  举报