重学前端 23 # 狭义的文档对象DOM

简介: 重学前端 23 # 狭义的文档对象DOM

一、DOM API 介绍


文档对象模型:用来描述文档,特指 HTML 文档,同时它又是一个对象模型,使用对象这样的概念来描述 HTML 文档


DOM API 大致包含 4 个部分


   节点:DOM 树形结构中的节点相关 API。

   事件:触发和监听事件相关 API。

   Range:操作文字范围相关 API。

   遍历:遍历 DOM 需要的 API。


   HTML 文档是一个由标签嵌套而成的树形结构,因此,DOM 也是使用树形的对象模型来描述一个 HTML 文档。




二、节点


DOM 的树形结构所有的节点有统一的接口 Node


image.png


节点的html写法

Element: <tagname>...</tagname>
Text: text
Comment: <!-- comments -->
DocumentType: <!Doctype html>
ProcessingInstruction: <?a 1?>




三、Node


Node 是 DOM 树继承关系的根节点。


1、Node 提供了一组属性,来表示它在 DOM 树中的关系


   parentNode

   childNodes

   firstChild

   lastChild

   nextSibling

   previousSibling



2、Node 中也提供了操作 DOM 树的 API


   appendChild

   insertBefore

   removeChild

   replaceChild



3、Node 还提供了一些高级 API


   compareDocumentPosition:是一个用于比较两个节点中关系的函数。

   contains:检查一个节点是否包含另一个节点的函数。

   isEqualNode:检查两个节点是否完全相同。

   isSameNode:检查两个节点是否是同一个节点。

   cloneNode:复制一个节点,如果传入参数 true,则会连同子元素做深拷贝。



4、DOM 标准规定了节点必须从文档的 create 方法创建出来


   createElement

   createTextNode

   createCDATASection

   createComment

   createProcessingInstruction

   createDocumentFragment

   createDocumentType



四、Element 与 Attribute


元素对应了 HTML 中的标签,它既有子节点,又有属性。


1、把元素的 Attribute 当作字符串来看,有以下的 API

  • getAttribute
  • setAttribute
  • removeAttribute
  • hasAttribute

2、把 Attribute 当作节点

  • getAttributeNode
  • setAttributeNode



五、查找元素


1、document 节点提供了查找元素的能力

   querySelector

   querySelectorAll

   getElementById

   getElementsByName

   getElementsByTagName

   getElementsByClassName


2、getElementById、getElementsByName、getElementsByTagName、getElementsByClassName,这几个 API 的性能高于 querySelector。


3、getElementsByName、getElementsByTagName、getElementsByClassName 获取的集合并非数组,而是一个能够动态更新的集合。

var cxk = document.getElementsByClassName('kaimo');
console.log(cxk.length); // 0
var kaimo = document.createElement('div');
kaimo.setAttribute('class', 'kaimo')
document.documentElement.appendChild(kaimo)
console.log(cxk.length); // 1


浏览器内部是有高速的索引机制,来动态更新这样的集合的。



六、遍历


DOM API 中还提供了 NodeIterator 和 TreeWalker 来遍历树。并且它们提供了过滤功能,还可以把属性节点也包含在遍历之内。


6.1、NodeIterator 的基本用法

var iterator = document.createNodeIterator(document.body, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT, null, false);
var node;
while(node = iterator.nextNode()){
    console.log(node);
}


6.2、TreeWalker 的用法

var walker = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, null, false)
var node;
while(node = walker.nextNode()){
    if(node.tagName === "p")
        node.nextSibling();
    console.log(node);
}

建议需要遍历 DOM 的时候,直接使用递归和 Node 的属性。




七、Range


Range API 表示一个 HTML 上的范围,这个范围是以文字为最小单位的。


1、注意Range API节点 API 更精确操作 DOM 树,并且性能更高,但是使用起来比较麻烦,在实际项目中,并不常用,只有做底层框架和富文本编辑对它有强需求。


2、创建 Range 一般是通过设置它的起止来实现

var range = new Range(),
    firstText = p.childNodes[1],
    secondText = em.firstChild
range.setStart(firstText, 9) // do not forget the leading space
range.setEnd(secondText, 4)


3、通过 Range 也可以从用户选中区域创建

// 用于处理用户选中区域
var range = document.getSelection().getRangeAt(0);


4、更改 Range 选中区段内容由 extractContents(取出) 和 insertNode(插入) 来实现。

var fragment = range.extractContents()
range.insertNode(document.createTextNode("abcd"))


参考


概念可以参考:


1、https://developer.mozilla.org/zh-CN/docs/Web/API/Document

2、https://www.runoob.com/jsref/dom-obj-document.html




目录
相关文章
|
1月前
|
存储 前端开发 JavaScript
前端中对象的深度应用与最佳实践
前端对象应用涉及在网页开发中使用JavaScript等技术创建和操作对象,以实现动态交互效果。通过定义属性和方法,对象可以封装数据和功能,提升代码的组织性和复用性,是现代Web开发的核心技术之一。
|
1月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
50 5
|
2月前
|
XML 编解码 JavaScript
DOM(文档对象模型)和 BOM(浏览器对象模型)
【10月更文挑战第19天】在前端开发中,理解 DOM(文档对象模型)和 BOM(浏览器对象模型)是至关重要的。它们是 Web 开发的基础,为我们提供了与网页文档和浏览器进行交互的能力。
|
2月前
|
JSON 前端开发 数据格式
前端的全栈之路Meteor篇(五):自定义对象序列化的EJSON介绍 - 跨设备的对象传输
EJSON是Meteor框架中扩展了标准JSON的库,支持更多数据类型如`Date`、`Binary`等。它提供了序列化和反序列化功能,使客户端和服务器之间的复杂数据传输更加便捷高效。EJSON还支持自定义对象的定义和传输,通过`EJSON.addType`注册自定义类型,确保数据在两端无缝传递。
|
2月前
|
JavaScript 前端开发 编译器
吐血整理:纯前端如何实现批量dom转图片,并下载成压缩包
【10月更文挑战第2天】吐血整理:纯前端如何实现批量dom转图片,并下载成压缩包
65 2
|
2月前
|
JSON 前端开发 数据格式
@RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)
文章详细讲解了在SpringMVC中如何使用`@RequestMapping`进行路由映射,并介绍了前后端参数传递的多种方式,包括传递单个参数、多个参数、对象、数组、集合以及JSON数据,并且涵盖了参数重命名和从URL中获取参数的方法。
249 0
@RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)
|
3月前
|
XML 缓存 JavaScript
提升对前端的认知,不得不了解Web API的DOM和BOM
该文章强调了在前端开发中理解和掌握DOM(文档对象模型)和BOM(浏览器对象模型)的重要性,并介绍了它们的相关操作和应用。
提升对前端的认知,不得不了解Web API的DOM和BOM
|
2月前
|
JavaScript 前端开发 UED
【前端基础篇】JavaScript之DOM介绍2
【前端基础篇】JavaScript之DOM介绍
29 0
|
2月前
|
JavaScript 前端开发 搜索推荐
【前端基础篇】JavaScript之DOM介绍1
【前端基础篇】JavaScript之DOM介绍
44 0
|
3月前
|
JavaScript 前端开发
网页前端课程设计-【模仿】香港中文大学官网,轮播图及div+css布局,js的dom操作
这篇文章介绍了如何模仿香港中文大学官网进行网页前端课程设计,包括使用div+css布局、js的DOM操作以及实现轮播图等技术细节。