【SSD系列】DOM0, DOM1, DOM2, DOM3, DOM4,知多少

简介: DOM(文档对象模型)是针对 HTML和 XML文档的一个API(应用程序编程接口)。DOM描绘了一个层次化的节点树,允许开发人员添加、移除和修改页面的某一部分。DOM 脱胎于Netscape及微软公司创始的 DHTML(动态 HTML),但现在它已经成为表现和操作页面标记的真正的跨平台、语言中立的方式。

4.JPG


前言


关于关于【SSD系列】


前端一些有意思的内容,旨在3-10分钟里, 500-1500字,有所获,又不为所累。


DOM是前端工程师必修技能,DOM到底涵盖多少东西呢?

DOM Living Standard 这里有最新的DOM标准,不妨收藏一下。


什么是DOM


DOM(文档对象模型)是针对 HTML和 XML文档的一个API(应用程序编程接口)。DOM描绘了一个层次化的节点树,允许开发人员添加、移除和修改页面的某一部分。DOM 脱胎于Netscape及微软公司创始的 DHTML(动态 HTML),但现在它已经成为表现和操作页面标记的真正的跨平台、语言中立的方式。


DOM0


JavaScript在早期版本中提供了查询和操作Web文档的内容API(如:图像和表单),在JavaScript中定义了定义了'images''forms'等,因此我们可以像下这样访问第一张图片或名为“user”的表单:


document.images[0]
document.forms['user']
复制代码


这实际上是未形成标准的试验性质的初级阶段的DOM,现在习惯上被称为DOM0

还有我们所熟知的onclick事件,也是与DOM0级的事件。


DOM0级别的事件优点:


  1. 效率高
  2. 可以被Node.clone克隆
  3. 移除事件非常简单
    container.onclick=null即可
  4. 有点也是缺点,唯一性


多次复制会被覆盖


当然其他onxxx事件也是,而我们熟知的addEventListener则属于DOM2级别事件。


<div id="container" onclick="log1();log2()">点我</div>
<script>  
  function log1() {
    console.log('log1......');
  }
  function log2() {
    console.log('log2......');
  }
  // 移除事件
  container.onclick = null
</script>
复制代码


DOM1


大家熟知的Nodedocument, document.createElement都是在DOM1级别定义的。


更多关于知识,详见Document Object Model (DOM) Level 1 Specification


1998年 10月DOM1级规范成为W3C的推荐标准,为基本的文档结构及查询提供了接口,专注于HTML文档和XML文档。


DOM1中,DOM由两个模块组成:DOM Core(DOM核心)和DOM HTML。其中,DOM Core规定了基于XML的文档结构标准,通过这个标准简化了对文档中任意部分的访问和操作。DOM HTML则在DOM核心的基础上加以扩展,添加了针对HTML的对象和方法,如:JavaScript中的Document对象


每个节点都有nodeType属性,表示该节点的类型。


在Node类型上的12个数值常量表示:


NodeType常量 NodeType常量值 说明
Node.ELEMENT_NODE 1 我们常量的div,san,input等等
Node.ATTRIBUTE_NODE 2 属性。
Node.TEXT_NODE 3 包含按字面解释的纯文本,也可能包含转义后的HTML字符
Node.CDATA_SECTION_NODE 4 CDATA区块
Node.ENTITY_REFERENCE_NODE 5 DOM4 规范中被移除
Node.ENTITY_NODE 6 DOM4 规范里被移除
Node.PROCESSING_INSTRUCTION_NODE 7 用于XML文档的 ProcessingInstruction (en-US) ,例如 <?xml-stylesheet ... ?> 声明
Node.COMMENT_NODE 8 注释
Node.DOCUMENT_NODE 9 表示整个HTML页面
Node.DOCUMENT_TYPE_NODE 10 文档类型(doctype)信息。
Node.DOCUMENT_FRAGMENT_NODE 11 文档片段。性能优化常用。
Node.NOTATION_NODE 12 DOM4 规范中被移除


DOM2


我们熟知的·addEventListner, document.body.stylegetElementById这些都是DOM2级别的东西。


  • DOM2级核心(DOMLevel2 Core)
    详情参见 DOM-Level-2-Core Overview , DOM-Level-2-CoreDOM-Level-2-Core Changes
    在 1级核心基础上构建,为节点添加了更多方法和属性。
    例如 importNode, createElementNS, createAttributeNS, getElementsByTagNameNS and getElementById等等
  • DOM2级视图(DOM Level2 Views)
    详情参见 DOM-Level-2-Views Overview
    为文档定义了基于样式信息的不同视图。
    我们常用的就是document.defaultView,其返回文档所在的Window
  • DOM2 级事件(DOM Level2 Events)
    详情参见 DOM-Level-2-Events Overview
    说明了如何使用事件与 DOM文档交互。
    我们比较熟悉的就是 addEventListner, 基于EventTarget的整个事件系统都是DOM2定义的。
  • DOM2级样式(DOM Level 2 Style)
    详情参见 DOM-Level-2-Style Overview
    定义了如何以编程方式来访问和改变 CSS 样式信息。


比如我们常见 CSSStyleDeclaration CSSStyleSheet 这些重要的对象,别说你没用过?document.body.style其返回的就是CSSStyleDeclaration.




const nodeIterator = document.createNodeIterator(
    document.body,
    NodeFilter.SHOW_ELEMENT,
    {
      acceptNode(node) {
       return node.nodeName.toLowerCase() === 'p' ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
     }
   }
);
const pars = [];
let currentNode;
while (currentNode = nodeIterator.nextNode()) {
  pars.push(currentNode);
}
复制代码


  • DOM2级HTML(DOMLevel2HTML)
    详情参见 DOM-Level-2-HTML Overview
    其扩展了 DOM Level 2 Core API [ DOM Level 2 Core ] ,以描述特定于 HTML 文档[ HTML 4.01]和 XHTML 文档[ XHTML 1.0]的对象和方法。


一般来说,操作层次化文档结构、元素和属性所需的功能将在核心部分中找到; 依赖于 HTML 中定义的特定元素的功能将在本部分中找到。


HTMLOptionsCollection就是新增的, 你别说不知道,其就是<option>节点的集合。DOMImplementation 接口的 hasFeature可还记得,也是哦。


DOM3



详情可参见 DOM-Level-3-Core OverviewDOM-Level-3-CoreDOM-Level-3-Core Changes


它完成了 DOM 和 XML信息集文档之间的映射,包括对 XML Base [ XML Base ]的支持,增加了向 DOM Nodes 附加用户信息,提供了解析名称空间前缀或操作“ ID”属性的机制等等。


  • DOM加载和保存模块(DOM Load and Save):引入了以统一方式加载和保存文档的方法
  • DOM验证模块(DOM Validation):定义了验证文档的方法
  • DOM核心的扩展(DOM Style):支持XML 1.0规范,涉及XML Infoset、XPath和XML Base


DOM4




2015年11月19日, DOM4发布,详情可参见 W3C DOM4

DOM4增加了 Mutation Observers ,作为原来 Mutation Events的替代。


小结



先提个问题,我们常说的HTML5是 2008年发布的,他应该和DOM几对应你?


  1. onclick 系列是DOM0级别的事件,只能有一个函数,一定条件下可以被复制
  2. addEventListener系列是DOM2级别的事件
  3. XPath 属于DOM3级别的东西,平时并不常见,其也可用于遍历节点。
  4. DOM4,增加了观察节点变化的能力。


综上可见,DOM1, DOM2是核心,其余的我们使用并不多。

写在最后



不忘初衷,【SSD系列】,3-5分钟,500-1000字,有所得,而不为所累,如果你觉得不错,你的一赞一评就是我前行的最大动力。


技术交流群请到 这里来。 或者添加我的微信 dirge-cloud,一起学习。

相关文章
|
XML JavaScript 前端开发
javascript中DOM0,DOM2,DOM3级事件模型解析
DOM 即 文档对象模型。 文档对象模型是一种与编程语言及平台无关的API(Application programming Interface),借助于它,程序能够动态地访问和修改文档内容、结构或显示样式。
2516 0
|
JavaScript 前端开发 数据格式
DOM0级事件处理、DOM2级事件处理
1 2 3 4 5 DOM事件 6 7 8 9 10 11 function fun1(){ 12 alert("hello world!"); 13 ...
632 0
|
1月前
|
缓存 JavaScript 前端开发
JavaScript中DOM操作:新手常犯错误与避免策略
【4月更文挑战第1天】本文介绍了JavaScript中DOM操作的基础和新手常犯错误,包括频繁查询DOM、不恰当的遍历、滥用innerHTML、忽视异步与DOM状态以及过度同步更新。建议包括缓存DOM引用、注意文本节点、慎用innerHTML以防止XSS、正确处理异步和批量更新。遵循最佳实践,开发者能提升代码质量和应用性能。
25 2
|
2月前
|
JavaScript 前端开发
JavaScript操作DOM元素
JavaScript操作DOM元素
13 1
|
2月前
|
JavaScript 前端开发
如何使用 JavaScript 操作 DOM?
如何使用 JavaScript 操作 DOM?
18 0
|
7天前
|
前端开发 JavaScript 数据安全/隐私保护
前端javascript的DOM对象操作技巧,全场景解析(二)
前端javascript的DOM对象操作技巧,全场景解析(二)
|
7天前
|
移动开发 缓存 JavaScript
前端javascript的DOM对象操作技巧,全场景解析(一)
前端javascript的DOM对象操作技巧,全场景解析(一)
|
7天前
|
JavaScript 前端开发
JavaScript DOM 文档对象模型(获取、改变html元素)
JavaScript DOM 文档对象模型(获取、改变html元素)
|
14天前
|
JavaScript 前端开发 UED
深入解析JavaScript原生操作DOM技术
【4月更文挑战第22天】本文深入探讨JavaScript原生DOM操作技术,包括使用`getElement*`方法和CSS选择器获取元素,借助`createElement`与`appendChild`动态创建及插入元素,修改元素内容、属性和样式,以及删除元素。通过掌握这些技术,开发者能实现页面动态交互,但应注意避免过度操作DOM以优化性能和用户体验。