Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >DOM 元素的循环遍历

DOM 元素的循环遍历

原创
作者头像
Krry
修改于 2020-06-10 09:09:50
修改于 2020-06-10 09:09:50
7.1K0
举报
文章被收录于专栏:KrryblogKrryblog

博客地址:https://ainyi.com/89

获取 DOM 元素的几种方式

get 方式:

  1. getElementById
  2. getElementsByTagName
  3. getElementsByClassName
  4. getElementsByName

返回类型 HTMLCollection[]


query 方式:

  1. querySelector
  2. querySelectorAll

返回类型 NodeList[]


获取 dom 元素的详细介绍:https://ainyi.com/31

获取元素

首先用两种方式获取元素

代码语言:txt
AI代码解释
复制
let a = document.getElementsByClassName('title')
let b = document.querySelectorAll('.title')

一般循环

get 方式

get 方式获取的 dom 元素,仅可使用==for-in、for-of、for==循环

代码语言:txt
AI代码解释
复制
for(let key in a) {
  console.log(a[key])
}
// dom
// ...(每个dom元素)
// length(集合长度)
// ƒ item() { [native code] }
// ƒ namedItem() { [native code] }

其中:

==ƒ item() { native code }==

可通过 a.item(index) 获取 dom 元素,类似 aindex

==ƒ namedItem() { native code }==

可通过 a.namedItem('popo') 获取 name 属性为 'popo' 的 dom 元素(若多个元素有相同的 name 属性,返回第一个)

for-of、for 循环可获取每个 dom 元素:

代码语言:txt
AI代码解释
复制
for(let val of a) {
  console.log(val)
}
// dom
// ...(每个dom元素)

for(let i = 0; i < a.length; i++) {
  console.log(a[i])
}
// dom
// ...(每个dom元素)

query 方式

query 方式获取的 dom 元素,可使用==forEach、for-in、for-of、for==循环

forEach、for-of、for 循环的结果无差别

但 for-in 相比 get 方式 的 for-in,循环得出的结果稍有不同

代码语言:txt
AI代码解释
复制
for(let key in b) {
  console.log(b[key])
}
// dom
// ...(每个dom元素)
// length(集合长度)
// ƒ item() { [native code] }
// ƒ entries() { [native code] }
// ƒ forEach() { [native code] }
// ƒ keys() { [native code] }
// ƒ values() { [native code] }

与 get 方式的 for-in 相比,少了 ƒ namedItem() { native code },多了 Object 的几个方法

这说明,query 方式获取的 dom 元素集合,可执行 Object 对应的方法,但没有 namedItem() 方法

ES6 转换普通数组

ES6 提供了 Array.from() 方法可将这些集合转换成普通数组,这样就可以享用数组的各种方法了

代码语言:txt
AI代码解释
复制
let array = Array.from(a)

深度遍历

节点树的几个属性

  • childElementCount:返回子元素(不包括文本节点和注释)的数量
  • parentNode:ele 的父节点
  • childNodes:ele 的所有的直接子节点
  • nextSibling:ele 的下一个同辈节点
  • previousSibling:ele 的上一个同辈节点

因为 childNodes 包含看不见的空格文本,还有注释等内容,所以使用起来不是太方便

因此,js 又重新引入了元素树的概念。这个在我们实际应用中,用的比较普遍

元素树:仅仅包含元素节点的树结构,不是一颗新树,尽是节点数的子集

为元素新增了下面几个属性:

  • parentElement:节点的父元素
  • children:返回节点的所有子元素
  • firstElementChild:第一个直接子元素
  • lastElementChild:最后一个直接子元素
  • previousElementSibling:ele 的前一个兄弟元素
  • nextElementSibling:ele 的下个兄弟元素

一般来说,区别元素节点,属性节点,文本节点的通用方式是判断该节点的 nodeType

常见的几种 nodeType:

元素节点:1,

属性节点:2,

文本节点:3,

注释节点:8,

...

遍历直接子级元素

假设 html 如下,要遍历出 div 中的所有直接子级的元素节点:

代码语言:txt
AI代码解释
复制
<div id="list">
  <p>hello</p>
  <span>world</span>
  <em>cookieParse()</em>
</div>

用 firstChild,lastChild 进行元素遍历

代码语言:txt
AI代码解释
复制
let list = document.getElementById('list')

let child = list.firstChild

console.log(list.nextSibling)

while(child != list.lastChild) {
  if(child.nodeType === 1) {
    console.log( child )
  }
  child = child.nextSibling
}

使用 firstElementChild,nextElementSibling

代码语言:txt
AI代码解释
复制
let list = document.getElementById('list')

let child = list.firstElementChild

while(child) {
  console.log( child )
  child = child.nextElementSibling
}

深度优先遍历

遍历所有节点

深度优先遍历:当同时有兄弟节点和子节点的时候,总是优先遍历子节点

代码语言:txt
AI代码解释
复制
function getChildren(parent) {
  // 如果当前节点是元素节点,输出当前元素
  parent.nodeType === 1 && console.log(parent);
  // 获得父节点的所有直接子节点
  let children = parent.childNodes
  // 遍历 children 中每个节点
  for(let i = 0, len = children.length; i<len; i++) {
    // 对当前子节点递归
    getChildren(children[i])
  }
}
getChildren(document.body)

需要注意的是:递归的运行效率没有迭代的运行效率高,一般都需要把递归的循环优化成迭代的循环

所以上面递归算法可以进一步优化

优化深度优先遍历

使用 NodeIterator 对象,可以对 DOM 树进行深度优先的搜索

创建 NodeIterator 对象,需要使用 document 对象的 createNodeIterator 方法,该方法接收四个参数:

  • root:搜索开始的节点
  • whatToShow:一个数值代码,表示哪些节点需要搜索
  • filter:NodeFilter 对象,决定忽略哪些节点
  • entityReferenceExpansion:布尔值,表示是否需要扩展实体引用

whatToShow 参数:

参数

意义

NodeFilter.SHOW_ALL

显示所有类型的节点

NodeFilter.SHOW_ELEMENT

显示元素节点

NodeFilter.SHOW_ATTRIBUTE

显示特性节点

NodeFilter.SHOW_TEXT

显示文本节点

NodeFilter.SHOW_CDATA_SECTION

显示CDATA节点。对HTML页面无用

NodeFilter.SHOW_ENTITY_REFERENCE

显示实体引用节点

NodeFilter.SHOW_ENTITYE

显示实体节点

NodeFilter.SHOW_PROCESSING_INSTRUCTION

显示处理指令节点

NodeFilter.SHOW_COMMENT

显示注释节点

NodeFilter.SHOW_DOCUMENT

显示元档节点

NodeFilter.SHOW_DOCUMENT_TYPE

显示文档类型节点

NodeFilter.SHOW_DOCUMENT_FRAGMENT

显示文档片段节点

NodeFilter.SHOW_SHOW_NOTATION

显示符号节点

NodeFilter.SHOW_DOCUMENT_TYPE

显示文档类型节点

优化如下:

代码语言:txt
AI代码解释
复制
function getChildren(parent){
  // 获取 NodeIterator 对象
  let t = document.createNodeIterator(parent, NodeFilter.SHOW_ELEMENT, null, false)
  // 循环遍历对象的下一个节点
  let currNode = null
  while((currNode = t.nextNode()) !== null) {
    // 节点不为空,就一直循环遍历下去;直到为 null,才中断循环
    console.log(currNode)
  }
}
getChildren(document.body)

博客地址:https://ainyi.com/89

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
节点操作
网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示。
星辰_大海
2020/09/30
1.2K0
前端学习(47)~DOM简介和DOM操作
DOM:Document Object Model,文档对象模型。DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构。目的其实就是为了能让js操作html元素而制定的一个规范。
Vincent-yuan
2020/03/19
2.1K0
节点操作
获取元素通常使用两种方式: 1. 利用 DOM 提供的方法获取元素           document.getElementById() 
梨涡浅笑
2022/05/08
1.5K0
节点操作
前端成神之路-WebAPIs02
自定义属性目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。
海仔
2020/12/22
8090
前端成神之路-WebAPIs02
JavaScript DOM(二)
通过上文可知获取元素可以来利用 DOM 提供的方法来获取元素,如 getElementById、querySelector 等方法,但是也可以利用节点关系来获取元素
赤蓝紫
2023/01/01
6990
JavaScript DOM(二)
JavaScript——DOM基础
文档对象模型(Document Object Model),简称DOM,是W3C组织推荐的处理可扩展标记语言(HTML或者XML)的标准接口。
岳泽以
2022/10/26
6.9K0
JavaScript——DOM基础
Js DOM
要创建新的 HTML 元素 (节点)需要先创建一个元素,然后在已存在的元素中添加它。
hss
2022/02/25
4.1K0
JavaScript学习笔记010-DOM节点的运用
Author:Mr.柳上原 付出不亚于任何的努力 愿我们所有的努力,都不会被生活辜负 不忘初心,方得始终 不常用的东西很快就找不到了 不常写的方法很快就忘记了 字符串和数组的方法 大家还记的几个 <!DOCTYPE html> <!-- 文档类型:标准html文档 --> <html lang='en'> <!-- html根标签 翻译文字:英文 --> <head> <!-- 网页头部 --> <meat charset='UTF-8'/> <!-- 网页字符编码 --> <meat name='
Mr. 柳上原
2018/09/05
4460
dom啦3
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>03-JavaScript-获取DOM元素下</title> </head> <body> <div> <h1>1</h1> <h2>2</h2> <p class="item">3</p> <p>4</p> <span>5</span> </div> <script> // 1.获取指定元素所有的子元素
贵哥的编程之路
2020/10/28
2010
vue3+echarts应用——深度遍历html的dom结构并用树图进行可视化
大家好,我是yma16,本文分享关于 vue3+echarts应用——深度遍历 html 的 dom结构并使用树图进行可视化。
yma16
2024/02/17
5180
vue3+echarts应用——深度遍历html的dom结构并用树图进行可视化
js 深度解析DOM
因为document是window的一个属性,因为属性都是对象拥有的,所以他是一个object;
贵哥的编程之路
2020/11/03
5.4K0
js 深度解析DOM
前端day13-JS(WebApi)学习笔记(attribute语法、DOM节点操作)
小技巧:如果API写的是Emement复数的形式,也就是后面加了s(Emements)那么它返回的就是一个伪数组 否则就是单个对象,一般只有id才会是单个对象,其他方式获取(标签名 类名)都是伪数组.
帅的一麻皮
2020/04/19
3.2K0
前端day13-JS(WebApi)学习笔记(attribute语法、DOM节点操作)
第30天:DOM对象操作
documment.getElementById() documment.getElementsByTagName() documment.getElementsByClassName() //主流浏览器支持,IE6、7、8不兼容
半指温柔乐
2018/09/11
4280
DOM--文档对象模型
DOM中文名文档对象模型,英文名Document Object Model,我们简称为DOM,是针对html和xml文档的一种API,将html以一种树状结构呈现出来,可以更直观去研究文档结构,我们将这种树状文档结构称为--DOM树,或者节点树,一样的概念
子舒
2022/06/09
1.3K0
DOM--文档对象模型
JavaScript笔记(14)
网页中的所有内容都是节点(标签,属性,文本注释等),在DOM中,节点使用node来表示.
y191024
2022/09/20
4020
JavaScript笔记(14)
DOM「建议收藏」
当创建了一个网页并把它加载到web浏览器中时,DOM就悄然而生。浏览器根据网页文档创建一个文档对象。
全栈程序员站长
2022/09/21
1.1K0
DOM「建议收藏」
DOM、BOM一些兼容性问题
汇集了许多关于DOM和BOM的兼容性问题,主要是关于 IE 浏览器的,考虑到浏览器迭代,这里主要列出了 IE8 以及之后的浏览器版本。 IE8 浏览器在 2008年推出,距现在(2019)已有11年之久,已经是很老的一款浏览器了。但是在一些项目中,可能仍需要考虑到兼容性,如果兼容到 IE8 已经是很兼容了,毕竟该浏览器也几乎没多少市场份额了。多是一些机构或政府部门在使用。而有些兼容性问题也可能是其它浏览器之间的差异,比如 Chrome 和 FireFox 对于鼠标滚轮事件对象的滚轮方向判断方式不同,Chrome使用 wheelDelta,而FireFox 则采用 detail 做判断。下面将一一说明或做补充实现来尽量弥补浏览器之间的差异。其实大部分就是为了兼容 IE 早期浏览器。
多云转晴
2019/10/23
1.7K0
DOM、BOM一些兼容性问题
JavaScript-Dom
JavaScript-Dom 简介 DOM:Document Object Model 节点 HTML 文档中的所有内容都是节点 整个文档是一个文档节点 每个 HTML 元素是元素节点 HTML 元素内的文本是文本节点 每个 HTML 属性是属性节点 注释是注释节点 document对象 常用属性 名称 说 明 referrer 返回载入当前文档的**URL** URL 返回当前文档的**URL** document.referrer document.URL ​ document常用方法 名称 说 明
xiaozhangStu
2023/05/04
5030
JavaScript之DOM
一、什么是DOM? DOM (Document Object Model)是指文档对象模型,通过它,可以访问HTML文档的所有元素。 DOM(Document Object Model)是一套
人生不如戏
2018/04/10
1.7K0
JavaScript之DOM
第八节dom以及dom库的封装
1、获取页面中元素的方法 document.getElementById() context.getElementsByTagName() context.getElementsByClassName() ie6~8不兼容 document.getElementsByName() 应用于表单中的name document.body document.documentElement context.querySelector/context.quer
河湾欢儿
2018/09/06
1.2K0
相关推荐
节点操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档