JavaScript — DOM的增删改查、节点、事件、文档的加载

2023-05-16

目录

一、DOM

二、节点

三、事件

四、文档的加载

五、DOM查询

1.获取元素节点

2.获取元素节点的子节点 

3.获取父节点和兄弟节点

4. 其他DOM查询的方法

常用搜索方法总结:

5.matches()与closest()

六、DOM的增删改 

创建新节点的方法

插入和移除节点的方法

七、DocumentFragment


一、DOM

DOM,全称Document Object Model 文档对象模型。

JS中通过DOM来对HTML文档进行操作。只要理解了DOM就可以随心所欲的操作WEB页面。

  • 文档——文档表示的就是整个的HTML网页文档
  • 对象——对象表示将网页中的每一个部分都转换为了一个对象
  • 模型——使用模型来表示对象之间的关系,这样方便我们获取对象

当网页被加载时,浏览器会创建页面的文档对象模型。

HTML DOM 模型被结构化为对象树:

对象的HTML DOM树如下:

HTML DOM 是 HTML 的标准对象模型和编程接口。它定义了:

  • 作为对象的 HTML 元素
  • 所有 HTML 元素的属性
  • 访问所有 HTML 元素的方法
  • 所有 HTML 元素的事件

 

二、节点

节点Node,是构成我们网页的最基本的组成部分,网页中的每一个部分都可以称为是一个节点。

比如:html标签、属性、文本、注释、整个文档等都是一个节点。

虽然都是节点,但是实际上它们的具体类型是不同的。

常用节点分为四类

  • 文档节点——整个HTML节点
  • 元素节点——HTML文档中的HTML标签
  • 属性节点——元素的属性
  • 文本节点——HTML标签中的文本内容

 

节点的类型不同,属性和方法也都不尽相同。

节点的属性如下图所示:

 

        浏览器已经为我们提供文档节点对象,这个对象是window属性,可以在页面中直接使用,文档节点代表的是整个网页

<body>
    <button id="btn">我是一个按钮</button>
    <script> 
    //获取到button对象
    let btn = document.getElementById("btn")
    console.log(btn);
    //修改按钮的文字
    btn.innerHTML = "I'm a button"
    </script>
</body>

三、事件

事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间。

JavaScript与HTML之间的交互是通过事件实现的。

对于Web应用来说,有下面这些代表性的事件:点击某个元素、将鼠标移动至某个元素上方、按下键盘上某个键等等。 

        方法一:可以在事件对应的属性中设置一些JS代码,这样当事件被触发时,这些代码将会执行,这种写法称为结构与行为耦合,不方便维护,不推荐使用:

<button id="btn" onclick="alert('Hello')">我是一个按钮</button>

        方法二:还可以为按钮的对应事件绑定处理函数的形式来响应事件,这样当事件被触发时,其对应的函数会被调用:

<body>
    <button id="btn">我是一个按钮</button>
    <script>
        let btn = document.getElementById("btn")
        //绑定一个单击事件
        //像这样为单击事件绑定的函数,我们称为单击响应函数
        btn.onclick = function(){
            alert("hello")
        }
    </script>   
</body>

 

四、文档的加载

        浏览器在加载一个页面时,是按照自上向下的顺序加载的,读取到一行就运行一行,如果将script标签写到页面的上边,在代码执行时,页面还没有加载,页面可以加载DOM对象也没有加载,会导致无法获取到DOM对象

        将JS代码编制写到页面的下面就是为了可以在页面加载完毕以后再执行JS代码

        如果要将代码写到页面上边,可以使用onload事件,onload事件会在整个页面加载完成后才会被触发。

         为window绑定一个onload事件,该事件对应的响应函数将会在页面加载完成后执行,这样就可以确保代码执行时所有的DOM对象都已经加载完毕。

举个例子:

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        window.onload = function(){
            let btn = document.getElementById("btn")
            btn.onclick = function(){
                alert("Hello")
            }
        }
    </script>
</head>
<body>
    <button id="btn">我是一个按钮</button>
</body>

五、DOM查询

1.获取元素节点

通过document对象调用

  • getElementById()  通过id属性获取一个元素节点对象(id属性是唯一的)
  • getElementsByTagName()  通过标签名获取一组元素节点对象(标签名可以有多个,最终获取到的是一个数组
  • getElementsByName()  通过name属性获取一组元素节点对象(name属性可以有多个,最终获取到的是一个数组

innerHTML用于获取元素内部的HTML代码的

        对于自结束标签,这个属性没有意义

如果需要读取元素节点属性,直接使用 元素.属性名

        例子:元素.id 元素.name 元素.value

        注意:class属性不能采取这种方式,读取class属性时需要使用 元素.className

2.获取元素节点的子节点 

通过具体的元素节点调用

  • getElementsByTagName()  方法,返回当前节点的指定标签名后代节点
  • childNodes  属性,表示当前节点的所有子节点,该属性会获取包括文本节点在内的所有节点
  • firstChild  属性,表示当前节点的第一个子节点(包括空白文本节点)
  • lastChild  属性,表示当前节点的最后一个子节点 

3.获取父节点和兄弟节点

通过具体的节点调用

  • parentNode  属性,表示当前节点的父节点
  • previousSibling  属性,表示当前节点的前一个兄弟节点(也可能获取到空白节点)
  • nextSibling  属性,表示当前节点的后一个兄弟节点 

innerText

该属性可以获取到元素内部的文本内容

它和innerHTML类似,不同的是它会自动将html去除 

4. 其他DOM查询的方法

body标签中的内容如下:

<body>
    <div class="box1">
        <div>hhhhhhhhhhhhh</div>
    </div>
    <div class="box1"></div>
    <div class="box1"></div>
</body>

获取body标签

let body = document.getElementsByTagName("body")[0]

在document中有一个body属性,它保存的是body的引用

let body = document.body;

document.documentElement保存的是html根标签

let html = document.documentElement

document.all代表页面中的所有元素

    let all = document.all
    for(let i=0; i<all.length; i++){
        console.log(all[i]);
    }

根据元素的class属性值查询一组元素节点对象

let box1 = document.getElementsByClassName("box1")

获取class为box1中的所有的div

document.querySelector()

需要一个选择器的字符串作为参数,可以根据一个CSS选择器来查询一个元素节点对象

使用该方法总会返回唯一的一个元素,如果满足条件的元素有多个,那么它只会返回第一个

let div = document.querySelector(".box1 div")

 document.querySelectAll()

该方法和document.querySelector()用法类似,不同的是它会将符合条件的元素封装在一个数组

即使符合条件的元素只有一个,它也会返回数组

let divs = document.querySelectorAll(".box1")

 

常用搜索方法总结:

 

5.matches()与closest()

elem.matches(css) 不会查找任何内容,它只会检查 elem 是否与给定的 CSS 选择器匹配。它返回 true 或 false

元素的祖先(ancestor)是:父级,父级的父级,它的父级等。祖先们一起组成了从元素到顶端的父级链。

elem.closest(css) 方法会查找与 CSS 选择器匹配的最近的祖先。elem自己也会被搜索。

换句话说,方法  closest 在元素中得到了提升,并检查每个父级。如果它与选择器匹配,则停止搜索并返回该祖先。

 所有的 "getElementsBy*" 方法都会返回一个 实时的(live) 集合。这样的集合始终反映的是文档的当前状态,并且在文档发生更改时会“自动更新”。

在下面的例子中,有两个脚本。

  1. 第一个创建了对 <div> 的集合的引用。截至目前,它的长度是 1
  2. 第二个脚本在浏览器再遇到一个 <div> 时运行,所以它的长度是 2
<div>First div</div>

<script>
  let divs = document.getElementsByTagName('div');
  alert(divs.length); // 1
</script>

<div>Second div</div>

<script>
  alert(divs.length); // 2
</script>

相反,querySelectorAll 返回的是一个 静态的 集合。就像元素的固定数组。

如果我们使用它,那么两个脚本都会输出 1

<div>First div</div>

<script>
  let divs = document.querySelectorAll('div');
  alert(divs.length); // 1
</script>

<div>Second div</div>

<script>
  alert(divs.length); // 1
</script>

六、DOM的增删改 

创建新节点的方法

document.createElement(tag) — 用给定的标签创建一个元素节点,

document.createTextNode(value) — 创建一个文本节点(很少使用),

elem.cloneNode(deep) — 克隆元素,如果 deep==true 则与其后代一起克隆。

插入和移除节点的方法

node.append(...nodes or strings) — 在 node 末尾插入,

node.prepend(...nodes or strings) — 在 node 开头插入,

node.before(...nodes or strings) — 在 node 之前插入,

node.after(...nodes or strings) — 在 node 之后插入,

node.replaceWith(...nodes or strings) — 替换 node

node.remove() — 移除 node

文本字符串被“作为文本”插入。

 

下面这张图直观的表示出了插入节点的位置:

elem.insertAdjacentHTML/Text/Element

为此,我们可以使用另一个非常通用的方法:elem.insertAdjacentHTML(where, html)

该方法的第一个参数是代码字(code word),指定相对于 elem 的插入位置。必须为以下之一:

  • "beforebegin" — 将 html 插入到 elem 前插入,
  • "afterbegin" — 将 html 插入到 elem 开头,
  • "beforeend" — 将 html 插入到 elem 末尾,
  • "afterend" — 将 html 插入到 elem 后。

第二个参数是 HTML 字符串,该字符串会被“作为 HTML” 插入。

 

 

我们很容易就会注意到这张图片和上一张图片的相似之处。插入点实际上是相同的,但此方法插入的是 HTML。

这个方法有两个兄弟:

  • elem.insertAdjacentText(where, text) — 语法一样,但是将 text 字符串“作为文本”插入而不是作为 HTML,
  • elem.insertAdjacentElement(where, elem) — 语法一样,但是插入的是一个元素。

它们的存在主要是为了使语法“统一”。实际上,大多数时候只使用 insertAdjacentHTML。因为对于元素和文本,我们有 append/prepend/before/after 方法 — 它们也可以用于插入节点/文本片段,但写起来更短。

七、DocumentFragment

DocumentFragment 是一个特殊的 DOM 节点,用作来传递节点列表的包装器(wrapper)。

我们可以向其附加其他节点,但是当我们将其插入某个位置时,则会插入其内容。

例如,下面这段代码中的 getListContent 会生成带有 <li> 列表项的片段,然后将其插入到 <ul> 中:

<ul id="ul"></ul>

<script>
function getListContent() {
  let fragment = new DocumentFragment();

  for(let i=1; i<=3; i++) {
    let li = document.createElement('li');
    li.append(i);
    fragment.append(li);
  }

  return fragment;
}

ul.append(getListContent()); // (*)
</script>

请注意,在最后一行 (*) 我们附加了 DocumentFragment,但是它和 ul “融为一体(blends in)”了,所以最终的文档结构应该是:

<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript — DOM的增删改查、节点、事件、文档的加载 的相关文章

随机推荐

  • python学习:最适合初学者的8本Python书籍

    Python是最友好的编程语言之一 xff0c 也因此成为初学者的首选 xff0c 为了帮助你更好更快的上手Python xff0c 并学会使用Python进行编程 xff0c 本文我们为初学者分享了最好的Python书籍 希望能够对你有所
  • 最适合Python入门到大牛必看的7本书籍,一定要收藏!

    Python零基础应该阅读哪些书籍 xff1f 我推荐这三本书 1 Python学习手册 xff08 第4版 xff09 以计算机科学家一样的思维方式来理解Python语言编程 xff0c 实用的学习指南 xff0c 适合没有Python编
  • 前端开发:深入使用proxy代理解决前端跨域问题

    在前端领域里面 xff0c 跨域指的是浏览器允许向服务器发送跨域请求 xff0c 进而克服Ajax只能同源使用的局限性限制 同源策略是一种约定 xff0c 而且是浏览器中最基本也是最核心的安全功能 xff0c 若缺少了该策略 xff0c 浏
  • 手工搭建Servlet实现

    现在作为一个Java程序员 xff0c 我们已经习惯了使用IDE和Web框架进行开发 xff0c IDE帮助我们做了编译 打包的工作 Spring框架则帮助我们实现了Servlet接口 xff0c 并把Servlet容器注册到了Web容器中
  • airflow 文档学习(二) - 概念

    1 核心功能 1 1 DAGs 有向无环图 反映所涉及的task的依赖关系 注 xff1a 搜索dag的时候 xff0c airflow只会关注同事包含 34 DAG 34 和 34 airflow 34 字样的py文件 1 2 scope
  • java使用枚举进行前后端交互,以列表方式返回前端

    在有些情况下 xff0c 有一些下拉选择器的数据项 xff0c 我们采取了枚举的方式返回前端一个列表 xff0c 但是里面的东西多 xff0c 前端不想写死 xff0c 需要提供接口返回 xff0c 如下图类似这种 第一步 xff1a 先创
  • python循环,16段代码入门Python循环语句,值得收藏!

    导读 本文重点讲述for语句和while语句 for语句属于遍历循环 xff0c while语句属于当型循环 除了两个循环语句外 xff0c 还介绍了break continue与pass三个用于控制循环结构中的程序流向的语句 在此基础之上
  • IntelliJ IDEA中Error java: 程序包org.slf4j不存在 解决办法

    前言 问题描述 是我这边重构一个工程的时候新建一个module 希望这个module仅仅做kafka消费的服务 刚刚搭建起来运行发现有异常 Error nbsp java 程序包org slf4j不存在 解决办法 很显然可以想到的就是这个里
  • Linux下的Ubuntu系统下载安装python3.9.0

    在安装python3 9 0之前 xff0c 首先要进行换源 xff0c 这样才能防止下载过慢的情况 我这里换的是阿里云的镜像源 xff0c 在终端输入一下命令 其他镜像源可以查看 xff1a https www myfreax com u
  • 操作系统的基本概念

    操作系统的基本概念 一 操作系统的基本概念1 1概念1 2特征1 2 1 并发1 2 2 共享1 2 2 1 互斥共享方式1 2 2 2 同时访问方式 1 2 3 虚拟1 2 4 异步 1 3 目的和功能1 3 1操作系统作为计算机系统资源
  • Android -No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-androideabi

    1 原因分析 xff1a 最新版ndk xff08 version 61 25 1 8937393 xff09 的toolchains文件夹中无arm linux androideabi文件 2 解决方案 xff1a 同时安装低版本的ndk
  • Python中的函数

    一 前言 我们在写Python时 xff0c 经常需要用到函数 xff0c 在此来说一下函数 xff0c 也就是本章要介绍的函数的作用于使用步骤 文章内容有点长 xff0c 请耐心看完哦 xff0c 文末有惊喜 二 Python中函数的作用
  • Spring自学笔记(学完老杜视频后再进行修改)

    Spring 概念 Spring框架是一个储存对象的容器 xff0c 是一个轻量级的开源Java开发框架 xff0c 它的核心是控制反转 xff08 IoC xff09 和面向切面编程 xff08 AOP xff09 xff0c 它由20多
  • 5 个用于自动化的杀手级 Python 脚本

    Python 是一种功能强大的语言 xff0c 广泛用于自动执行各种任务 无论您是开发人员 系统管理员 xff0c 还是只是想通过自动化日常任务来节省时间的人 xff0c Python 都能满足您的需求 这里有 5 个 Python 脚本
  • 操作系统实验报告:生产者――消费者问题算法的实现

    生产者 消费者问题算法的实现 文章目录 生产者 消费者问题算法的实现实验内容1 问题描述 xff1a 2 功能要求 xff1a 背景知识1 xff0e 进程管理2 xff0e 信号量的有关知识 思路核心代码运行结果结论 实验内容 1 问题描
  • eslint 禁用命令

    eslint disable ESLint 在校验的时候就会跳过后面的代码 还可以在注释后加入详细规则 xff0c 这样就能避开指定的校验规则了 eslint disable no new 常用 xff1a 39 rules 39 34 c
  • Collections类(Java学习笔记)

    Collections 类是 Java 提供的一个操作 Set List 和 Map 等集合的工具类 Collections 类提供了许多操作集合的静态方法 xff0c 借助这些静态方法可以实现集合元素的排序 查找替换和复制等操作 下面介绍
  • 关于ubuntu中修改grub的一些操作

    电脑的型号 xff1a 联想小新pro14 ubuntu版本 xff1a ubuntu20 04 问题描述 xff1a 1 第一个问题 xff0c 在购买了联想小新后 xff0c 进入U盘的Ubuntu系统发现键盘失灵 xff0c 出现时灵
  • Selenium基础 — CSS选择器定位大全

    1 css属性定位 css选择器策略示例说明 id telA选择id 61 34 telA 34 的所有元素 class telA选择 class 61 34 telA 的所有元素 属性名 61 属性值 name 61 telA 除了id和
  • JavaScript — DOM的增删改查、节点、事件、文档的加载

    目录 一 DOM 二 节点 三 事件 四 文档的加载 五 DOM查询 1 获取元素节点 2 获取元素节点的子节点 3 获取父节点和兄弟节点 4 其他DOM查询的方法 常用搜索方法总结 xff1a 5 matches 与closest 六 D