guqzhou guqzhou
首页
快捷导航
下载站
  • Html 篇
  • Javascript 基础篇
  • 框架

    • Vue2
  • 前端文章

    • Css 篇
    • 微信开发
    • JavaScript
    • Vue
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
    • JavaScript 基础
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 面试题库

    • HTML
    • CSS
    • jQuery
    • Vue
    • 零碎
  • 面试心得

    • 杂言碎语
  • 摘抄收录

    • ☆ 励志鸡汤
    • ❀ 人间烟火
    • ☣ 万物沦丧
    • ✌ 关掉烦恼
    • ✲ 小酒馆
  • 读书笔记

    • 《小狗钱钱》
    • 《穷爸爸富爸爸》
    • 《聪明人使用方格笔记本》
关于
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue资源
  • 主站CDN
  • Vercel
  • Netlify
  • Github
GitHub

guqzhou

喜欢所以去追求!
首页
快捷导航
下载站
  • Html 篇
  • Javascript 基础篇
  • 框架

    • Vue2
  • 前端文章

    • Css 篇
    • 微信开发
    • JavaScript
    • Vue
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
    • JavaScript 基础
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 面试题库

    • HTML
    • CSS
    • jQuery
    • Vue
    • 零碎
  • 面试心得

    • 杂言碎语
  • 摘抄收录

    • ☆ 励志鸡汤
    • ❀ 人间烟火
    • ☣ 万物沦丧
    • ✌ 关掉烦恼
    • ✲ 小酒馆
  • 读书笔记

    • 《小狗钱钱》
    • 《穷爸爸富爸爸》
    • 《聪明人使用方格笔记本》
关于
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue资源
  • 主站CDN
  • Vercel
  • Netlify
  • Github
GitHub
  • vue2
  • CSS

  • Javascript基础

    • js介绍
    • 数据类型
    • js检查数据类型的方法
    • 内存泄漏
    • 说一下闭包,并且有什么特点
    • 页面加载和滚动事件
    • 闭包
    • DOM
      • 简介
        • 概念
      • 节点
        • DOM树
        • 节点分类
        • DOM可以做啥
        • 获取节点
        • 查找节点
        • 增加节点
        • 克隆节点
        • 删除节点
    • 重绘和回流
    • 原型、原型链和继承
  • javascript进阶

  • typeScipt

  • vue2

  • vue3

  • react

  • vue实战

  • pinia的使用

  • gis

  • 前端文章

  • JavaScript文章

  • Vue文章

  • 小程序开发文章

  • uni-app

  • 学习笔记

  • TaroUI的使用

  • 工具使用

  • 前端
  • Javascript基础
guqzhou
2022-01-26
0

DOM

# 简介

# 概念

DOM:文档对象模型(Document object Model),操作网页上元素的API。可以改变网页的内容、结构和样式

# 节点

节点(Node):是网页中最基本的单位,网页中每一个部分都可以看作一个节点

# DOM树

HTML以树状的形式表现出来,提现出标签与标签的关系

image-20230126212245147

image-20230127085748684

# 节点分类

从上图可以看出节点(node)分为:

  • 文档节点(文档):document,整个html文档
  • 元素节点(标签):html标签
  • 属性节点(属性):href、src,元素的属性
  • 文本节点(文本):html标签中的文本内容
  • 注释节点(注释):/**/

我们又可以把以上的内容都可以看作一个对象,节点不同,所以每个对象都有自己的属性和方法

# DOM可以做啥

  • 摘对象(元素节点)
  • 设置元素的属性值
  • 设置元素的样式
  • 动态创建和删除元素
  • 事件处理响应:事件源、事件、事件处理函数

# 获取节点

如果我们要操作节点,我们必须知道如何获取节点

# 兼容性好

var div1 = document.getElementById('box')
var div2 = document.getElementsByTagName('box')
var div3 = document.getElementsByClassName('box')
1
2
3

# 兼容性略差

var div1 = document.querySelector('#box') // 获取第一个元素
var arr1 = document.querySelectorAll('.box') // 获取数组集合,伪数组
1
2

以上:

参数:css选择器字符串
返回值:css选择器中的第一个元素(对象),没有则返回null

伪数组:有长度有索引,但是没有数组方法,遍历只能用for

# 查找节点

# 节点关系

  • 父节点
  • 子节点
  • 兄弟节点

# 父节点查找

  • parentNode属性
  • 返回为最近一级父节点,找不到返回null
子元素.parentNode
1

上案例1:

<html>
    <div class="demo-father">
        <div class="demo-son"></div>
    </div>
</html>
<script>
    let son = document.getElementsByClassName('demo-son')
    son.addEventListener('click',function (){
        this.parentNode.style.display = 'none'
    })
</script>
1
2
3
4
5
6
7
8
9
10
11

上案例2:

<div class="demo-close">
    <span class="close"></span>
</div>

<div class="demo-close">
    <span class="close"></span>
</div>

<div class="demo-close">
    <span class="close"></span>
</div>
<script>
    let demoClose = document.querySelectorAll('demo-close')
    for (let i = 0;i < demoClose.length;i++) {
        demoClose[i].addEventListener('click',function () {
            this.parentNode.style.display = 'none'
        })
    }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 子节点查找

  • childNodes 获取所有的子节点,包括文本节点(空格、换行)、注释节点
  • children 仅获取所有元素节点,返回的是一个伪数组
父元素.childNodes
父元素.children(重点)
1
2

上案例:

<button>点击</button>
<ul>
    <li>666</li>
    <li>666</li>
    <li>666</li>
    <li>666</li>
</ul>
<script>
    let btn = document.querySelector('button')
    let ul = document.getElementsByTagName('ul')
    for(let i = 0; i < ul.children.length; i++) {
        btn.addEventListener('click',function () {
            ul.children[i].style.display = 'none'
        })
    }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 查找兄弟节点

  • nextElementSibling 下一个兄弟节点
  • previousElementSibling 上一个兄弟节点

上案例:

<button>点击</button>
<ul>
    <li>666</li>
    <li class="two">666</li>
    <li>666</li>
    <li>666</li>
</ul>
<script>
    let btn = document.querySelector('button')
    let ul = document.getElementsByTagName('ul')
    let two = document.querySelector('two')
    two.nextElementSibling.style.display = none
    two.previousElementSibling.style.display = none
    for(let i = 0; i < ul.children.length; i++) {
        btn.addEventListener('click',function () {
            ul.children[i].style.display = 'none'
        })
    }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 增加节点

  • 创建一个新的节点
  • 把新的节点放到指定元素的内部

# 创建节点

创造出一个新的网页元素,再把内容添加到元素中

document.createElement('标签名')  // 创建一个div标签
标签名.className = 'current'  // 追加属性
div.innerHTML = '内容' // 追加内容
1
2
3

# 追加节点

要想在界面看到,还得插入到某个父元素中

父元素.appendChild(要插入的元素) // 插入到父元素的最后
父元素.insertBefore(要插入的元素,在哪个元素之前) // 插入到父元素的前面
1
2

# 克隆节点

  • 复制一个原有节点
  • 把复制的节点放到指定的元素中
元素.cloneNode(布尔值)  // 克隆一个已有的元素节点
1

布尔值为true,代表会包含后代节点一起克隆
布尔值为false,代表不包含后代节点
默认false

上代码:

<ul class="clone-demo">
    <li>666</li>
</ul>
<script>
    let cloneDemo = document.querySelector('.clone-demo')
    let newNode =cloneDemo.cloneNode(false)
    console.log(newNode)  // 布尔值为false打印结果 <ul class="clone-demo"></ul>
    console.log(newNode)  // 布尔值为true打印结果 <ul class="clone-demo" <li>666</li></ul>
</script>
1
2
3
4
5
6
7
8
9

# 删除节点

原生dom操作中删除元素必须通过父元素来删除

父元素.removeChild(要删除的元素)
1

注:
如果不存在父子关系则删除不成功
删除节点和隐藏节点是有区别,删除则从html中删除,隐藏则是节点还存在

上次更新: 2023/01/29, 11:01:00
闭包
重绘和回流

← 闭包 重绘和回流 →

最近更新
01
面向对象
01-05
02
typescript用localStorage封装过期时间
01-05
03
npm、pnpm、yarn删除文件缓存
12-14
更多文章>
Theme by Vdoing | Copyright © 2021-2024 guqzhou | 萌ICP备20238188号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式