JavaScript语法基础之DOM基础

news2024/11/25 14:21:00

目录

1. DOM 基础

1.1. DOM 是什么?

1.1.1. DOM 对象

1.1.2. DOM 结构

1.2. 节点类型

1.3. 获取元素

1.3.1. getElementById()

1.3.2. getElementsByTagName()

1.3.3. getElementsByClassName()

1.3.4. getElementsByName()

1.4.如何去操作对象

修改属性(css)

1.5.如何动态的创建对象


1. DOM 基础

1.1. DOM 是什么?

1.1.1. DOM 对象

  • DOM全称Document Object Model(文档对象模型),它是由 W3C 定义的一个标准。
  • 我们有时候遇到鼠标移到某个元素上面时就改变颜色,或者动态添加元素或者删除元素等,其实这些效果就是通过DOM提供的方法来实现的。
  • 简单来说,DOM 里面有很多方法,我们通过它提供的方法来操作一个页面中的某个元素,例如:改变这个元素的颜色、点击这个元素实现某些效果、直接把这个元素删除等。
  • 一句话总结就是:DOM 操作,可以简单理解成“元素操作”。

1.1.2. DOM 结构

  • DOM采用的是树形结构,用树节点形式来表示页面中的每一个元素,我们先看下面一个例子:
  • <!DOCTYPE html> 
    <html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    <body>
        <h1>Gok</h1>
        <ui>
            <li>Gok是一个……</li>
            <li>Gok成立于……</li>
    </body>
    </html>
  • 对于上面这个 HTML 文档,DOM 会将其解析为如下图所示的树形结构。

  • 是不是很像一棵树呢?其实,这也叫做DOM 树。在这棵树上html 元素是树根,也叫根元素。
  • 接下来深入一层,我们发现有 headbody 这两个分支,它们位于同一层次上,并且有着共同的父节点(即 html),所以它们是兄弟节点。
  • head 有 2 个子节点:titlemeta(这两个是兄弟节点)。
  • body 有 3 个子节点:h1pp
  • 利用这种简单的家谱关系我们可以把各节点之间的关系清晰地表达出来。
  • 那么为什么要把一个HTML页面用树形结构表示呢?这也是为了更好地给每一个元素进行定位,以便让我们找到想要的元素。
  • 每一个元素就是一个节点,而每一个节点就是一个对象。
  • 也就是说,我们在操作元素时,其实就是把这个元素看成一个对象,然后使用这个对象的属性和方法来进行相关操作(这句话对理解 DOM 操作太重要了)。

1.2. 节点类型

  • JavaScript 中,节点也是分为很多类型的。
  • DOM 节点共有12种类型,不过常见的只有 3 种(其他的不用管)。
    • 元素节点(标签)
    • 属性节点(属性名)
    • 文本节点(文本)
  • 很多人看到下面这句代码,就认为只有一个节点,因为只有 div 这一个元素嘛。
  • 实际上,这里有 3 个节点:
<div id="wrapper">Gok</div>

1.3. 获取元素

获取元素,准确来说,就是获取元素节点(注意不是属性节点或文本节点)。

对于一个页面,我们想要对某个元素进行操作,就必须通过一定的方式来获取该元素。只有获取到了,才能对其进行相应的操作。

咦,这不跟 CSS 选择器相似吗?只不过选择器是 CSS 的操作方式,而 JavaScript 却有着属于自己的另一套方法。

JavaScript 中,我们可以通过以下 6 种方式来获取指定元素:

    • getElementById()
    • getElementsByTagName()
    • getElementsByClassName()
    • getElementsByName()
    • querySelector()、querySelectorAll()
    • document.title、document.body
  • 上面每一种方法都非常重要,我们要一个个地认真学透。
  • 请注意,JavaScript 是严格区分大小写的,所以在书写的时候,就不要把这些方法写错了。

1.3.1. getElementById()

  • JavaScript 中,如果想通过 id 来选中元素,我们可以使用 getElementById() 来实现。
  • getElementById 这个方法的名字看似很复杂,其实根据英文来理解就很容易了,也就是get element by id(通过 id 来获取元素)的意思。
  • 实际上,getElementById() 类似于 CSS 中的 id 选择器,只不过 getElementById()JavaScript 的操作方式。
  • 语法:
document.getElementById("id名")
  • 举例:
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script>
      window.onload = function () {
        var oDiv = document.getElementById("div1");
        oDiv.innertext = " ";
          oDiv.innerhtml = "imag";
      };
    </script>
  </head>
  <body>
    <div id="div1" style="color:pink"></div>
  </body>
</html>
  • 这个例子的 JavaScript 代码在HTML代码的上面,如果没有 window.onload,浏览器解析到 document.getElementById("div1") 就会报错,因为它不知道id"div1"的元素究竟是哪位兄弟。
  • 因此我们必须使用 window.onload,使得浏览器把整个页面解析完了再去解析window.onload内部的代码,这样就不会报错了。

1.3.2. getElementsByTagName()

  • JavaScript中,如果想通过标签名来选中元素,我们可以使用 getElementsByTagName() 方法来实现。
  • 同样,getElementsByTagName()类似于 CSS 中的元素选择器。
  • 语法:
document. getElementsByTagName("标签名")
  • 举例:
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script>
      window.onload = function () {
        var oUl = document.getElementById("list");
        var oLi = oUl.getElementsByTagName("li");
        oLi[2].style.color = "red";
      };
    </script>
  </head>
  <body>
    <ul id="list">
      <li>HTML</li>
      <li>CSS</li>
      <li>JavaScript</li>
      <li>jQuery</li>
      <li>Vue.js</li>
    </ul>
  </body>
</html>

1.3.3. getElementsByClassName()

  • JavaScript 中,如果想通过 class 来选中元素,我们可以使用 getElementsByClassName() 方法来实现。
  • 同样,getElementsByClassName() 类似于 CSS 中的 class 选择器。
  • 语法:
document. getElementsByClassName("类名")
  • 举例:
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script>
      window.onload = function () {
        var oLi = document.getElementsByClassName("select");
        oLi[0].style.color = "red";
      };
    </script>
  </head>
  <body>
    <ul id="list">
      <li>HTML</li>
      <li>CSS</li>
      <li class="select">JavaScript</li>
      <li class="select">jQuery</li>
      <li class="select">Vue.js</li>
    </ul>
  </body>
</html>

1.3.4. getElementsByName()

  • 对于表单元素来说,它有一个一般元素都没有的 name 属性。如果想要通过 name 属性来获取表单元素,我们可以使用 getElementsByName() 方法来实现。
  • 语法:
document.getElementsByName("name名")
  • 举例:单选按钮
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script>
      window.onload = function () {
        var oInput = document.getElementsByName("status");
        oInput[2].checked = true;
      };
    </script>
  </head>
  <body>
    你的最高学历:
    <label><input type="radio" name="status" value="本科" />本科</label>
    <label><input type="radio" name="status" value="硕士" />硕士</label>
    <label><input type="radio" name="status" value="博士" />博士</label>
  </body>
</html>
  • 举例:复选框
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script>
      window.onload = function () {
        var oInput = document.getElementsByName("fruit");
        for (var i = 0; i < oInput.length; i++) {
          oInput[i].checked = true;
        }
      };
    </script>
  </head>
  <body>
    你喜欢的水果:
    <label><input id =1 type="checkbox" name="fruit" value="苹果" />苹果</label>
    <label><input type="checkbox" name="fruit" value="香蕉" />香蕉</label>
    <label><input type="checkbox" name="fruit" value="西瓜" />西瓜</label>
  </body>
</html>

1.4.如何去操作对象

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>操作DOM对象</title>
</head>
<body>
<div class="container">程咬金</div> 						==》container
<input type="text" name="userName" value="程咬金">			==》userName
<br/>
<button id="change">修改</button>							==》change
</body>
<script>
    // 1. 找对象
    var container = document.getElementsByClassName("container")[0];
    var change = document.getElementById("change");
    var userName = document.getElementsByName("userName")[0];
    // 2. 操作对象
    change.onclick = function () {
    // 改变纯文本
        container.innerText = "苏烈";
    // 修改超文本
        container.innerHTML = "<h1 style='color: red'>苏烈</h1>";
    // 修改value属性
        userName.value = "牛魔";
    }
</script>
</html>
修改属性(css)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>操作DOM对象</title>
    <style>
        .box{
            width: 100px;
            height: 100px;
            background-color: red;
        }
        .box2{
            width: 200px;
            height: 200px;
            background-color: blue;
            border-radius: 200px;
        }
    </style>
</head>
<body>
<div class="box"></div>
<br>
<button id="change">修改</button>
</body>
<script>
    // 1. 找对象
    var box = document.getElementsByClassName("box")[0];
    var change = document.getElementById("change");
    // 2. 操作对象
    change.onclick = function () {
        box.style.backgroundColor = "green";
        box.style.width = "200px";
        box.style.height = "50px";
    }
</script>
</html>

1.5.如何动态的创建对象

// 动态创建元素
document.createElement("标签名字");
// 追加元素: 父级追加子级
父级对象.append(子级对象);
// 获取父级对象
子级对象.parentNode;
// 删除对象
dom对象.remove();

案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>DOM对象的动态创建</title>
    <style>
        tr{
            text-align: center;
            cursor: pointer;
        }
    </style>
</head>
<body>
<div class="box">
    <label>姓名:</label> <input type="text" value="嬴政" name="userName">
    <br>
    <br>
    <label>年龄:</label> <input type="number" value="45" name="userAge">
    <br>
    <br>
    <label>性别:</label>
    <input type="radio" name="userGender" value="男" checked> 男
    <input type="radio" name="userGender" value="女"> 女
    <br>
    <br>
    <input type="submit" id="add" value="添加">
</div>
<br>
<table style="width:500px ;border:1px"  id="data-table">
    <tr>
        <th>姓名</th>
        <th>年龄</th>
        <th>性别</th>
        <th>操作</th>
    </tr>
</table>
<script>
    // 找对象
    var dataTable = document.getElementById("data-table");
    var userName = document.getElementsByName("userName")[0];
    var userAge = document.getElementsByName("userAge")[0];
    var userGenders = document.getElementsByName("userGender");
    var add = document.getElementById("add");
    // 操作对象
    add.onclick = function () {
// 获取值
        var userNameValue = userName.value;
        var userAgeValue = userAge.value;
// 获取性别的值
        var userGenderValue = userGenders[0].checked ? "男" : "女";
// 动态创建标签
// 创建行
        var tr = document.createElement("tr");
// 创建列
        var userNameTd = document.createElement("td");
        userNameTd.innerText = userNameValue;
// 给TD绑定双击事件
        userNameTd.ondblclick = function () {
// 先获取文本值
            var value = this.innerText;
// 清除文本
            this.innerText = "";
// 动态创建input输入框
            var input = document.createElement("input");
            input.value = value;
// 给input绑定失去焦点的事件
            input.onblur = function () {
                userNameTd.innerText = this.value;
            };
            this.append(input);
        };
        var userAgeTd = document.createElement("td");
        userAgeTd.innerText = userAgeValue;
        var userGenderTd = document.createElement("td");
        userGenderTd.innerText = userGenderValue;
        var doTd = document.createElement("td");
// 动态创建一个删除按钮
        var delBtn = document.createElement("button");
        delBtn.innerText = "删除";
// 给删除按钮绑定事件
        delBtn.onclick = function(){
// 删除的逻辑
            var delTr = this.parentNode.parentNode;
// 删除
            delTr.remove();
        };
// 将删除按钮追加到doTd中
        doTd.append(delBtn);
// 将td 追加到 tr
        tr.append(userNameTd);
        tr.append(userAgeTd);
        tr.append(userGenderTd);
        tr.append(doTd);
// 将 tr 追加到 table
        dataTable.append(tr);
    }
</script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2061376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代驾系统源码开发中的用户体验优化:从设计到实现的全方位解析

在当今数字化时代&#xff0c;代驾服务已经成为城市生活中不可或缺的一部分。为了帮助开发者和企业快速搭建代驾服务平台&#xff0c;许多开源的代驾系统源码应运而生。这些源码不仅节省了开发时间&#xff0c;还为进一步的定制化开发提供了坚实的基础。本文将以“开源代驾系统…

Git使用——将GitHub设置成Token

GitHub提供了一种授权方式&#xff0c;使用Token来代替用户名和密码进行身份验证&#xff1b; 下面是将GitHub设置成Token的方法和操作流程&#xff1b; 一、登录GitHub账户 1. GitHub官网&#xff1a;https://github.com 2. 点击右上角的“Sign in”按钮&#xff0c;输入Gi…

遗传算法与深度学习实战(7)——使用遗传算法解决N皇后问题

遗传算法与深度学习实战&#xff08;7&#xff09;——使用遗传算法解决N皇后问题 0. 前言1. N 皇后问题2. 解的表示3. 遗传算法解决 N 皇后问题小结系列链接 0. 前言 进化算法 (Evolutionary Algorithm, EA) 和遗传算法 (Genetic Algorithms, GA) 已成功解决了许多复杂的设计…

Leetcode JAVA刷刷站(74)搜索二维矩阵

一、题目概述 二、思路方向 要在一个满足上述条件的矩阵中查找一个整数 target&#xff0c;我们可以利用矩阵的排序和递增特性来优化搜索过程。由于矩阵的每一行都是非严格递增的&#xff0c;且后一行的第一个元素大于前一行的最后一个元素&#xff0c;我们可以将矩阵视为一个…

Enhancing Octree-Based Context Models for Point Cloud Geometry Compression 论文笔记

1. 论文基本信息 发布于&#xff1a; IEEE SPL 2024 2. 创新点 分析了基于 one-hot 编码的交叉熵损失函数为什么不能准确衡量标签与预测概率分布之间的差异。介绍了 ACNP 模块&#xff0c;该模块通过预测占用的子节点数量来增强上下文模型的表现。实验证明了ACNP模块在基于八…

Linux --- 文件系统

1. 文件系统的概念 Linux 文件系统是一种用于管理、存储和组织数据的层次结构&#xff0c;用于在 Linux 操作系统中管理磁盘上的数据存储。它定义了如何在存储介质&#xff08;如硬盘、固态硬盘或 USB 闪存&#xff09;上组织文件和目录&#xff0c;以及如何读取、写入和操作这…

【时间序列预测_python_jupyter】使用neuralforecast包在jupyter-lab上预测并绘图

neuralforecast包有很多引入好的时间序列预测算法模型&#xff0c;可以直接通过接口调用。 支持的算法模型有&#xff1a; __all__ [RNN, GRU, LSTM, TCN, DeepAR, DilatedRNN,MLP, NHITS, NBEATS, NBEATSx, DLinear, NLinear,TFT, VanillaTransformer, Informer, Autoforme…

wsl2 airsim wairing for connect (Windows11 UE4.27)问题解决

一、概述 这里记述我遇到我在使用wsl2子系统与Windows11上进行交互时候&#xff0c;遇到的一些我之前没有遇到过的问题。 之前的我写的配置链接在这里。 UE5 with plugins AirSim in Windows & ROS in WSL2-Ubuntu 20.04配置过程记录_airsim ue5-CSDN博客文章浏览阅读455次…

Linux云计算 |【第二阶段】SECURITY-DAY2

主要内容&#xff1a; Zabbix报警机制&#xff08;创建触发器、设置邮箱、执行动作&#xff09;&#xff0c;Zabbix进阶操作&#xff08;主动发现、主被动监控模式、拓扑图、聚合图形&#xff09;、监控案例&#xff08;监控Nginx服务状态、监控TCP连接状态&#xff09; 一、Z…

C#开发基础之100个常用的C#正则表达式

前言 正则表达式是处理字符串的强大工具&#xff0c;特别是在文本搜索、替换和验证中。本文将100个常用的C#正则表达式进行分类&#xff0c;以帮助我们更快速地找到适合的正则表达式解决方案。 1. 基础匹配 这些正则表达式用于匹配一些基本的字符或字符串模式。 匹配任意字…

MATLAB-PSO-BiTCN-BiLSTM-Attention多变量分类

一、数据集 数据特征&#xff1a;12个多分类&#xff1a;4分类 ​ 二、PSO-BiTCN-BiLSTM-Attention网络 PSO-BiTCN-BiLSTM-Attention 网络是一种结合了多种深度学习技术和优化算法的复杂模型&#xff0c;用于处理时序数据任务&#xff0c;如时间序列预测、分类或其他相关问题…

IntelliJ IDEA ideaIU-2024.2.0.2.exe 启动 IDE 失败

以下是一些可能会导致 IDE 启动失败的问题的情况和解决方案&#xff1a; 启动 IDE 时弹出 Start Failed 的对话框&#xff0c;并且对话框内的信息中含有 crack 相关的内容 请在以下位置找到 .vmoptions 文件&#xff0c;打开并查看有没有 -javaagent 这行内容&#xff0c;如果…

gpt-4o-mini 等大模型的第三方中转API接口教程

How to use gpt-4o-mini by Python 文章目录 1 python环境安装1.1 anaconda 添加到系统变量1.2 anaconda 创建新的python虚拟环境 2 langchain 与 openai python包安装3 openai API 接入3.1 第三方API站点3.2 windows配置3.3 大模型API调用消费估算 4 相关教程重要事项 1 pyth…

【六】阿伟开始搭建Kafka学习环境

阿伟开始搭建Kafka学习环境 概述 上一篇文章阿伟学习了Kafka的核心概念&#xff0c;并且把市面上流行的消息中间件特性进行了梳理和对比&#xff0c;方便大家在学习过程中进行对比学习&#xff0c;最后梳理了一些Kafka使用中经常遇到的Kafka难题以及解决思路&#xff0c;经过上…

PDPS软件 那智机器人 (丰田版)离线程序导出处理

在PDPS仿真软件中导出的那智机器人离线程序&#xff0c;一般是无法直接给TFD控制装置-那智机器人&#xff08;丰田式样版&#xff09;导入及识别使用。因此要对导出的程序进行转换编译处理&#xff0c;才能给TFD那智机器人&#xff08;丰田式样版&#xff09;导入离线程序。以下…

comfyUI工作流-Flux大模型应用/黑神话悟空角色生成(附lora)

​ 是什么让悟空开始搬砖&#xff0c;这莫不是新的副本 其实我们用AI就能生成这种黑神话悟空的衍生图片 让悟空做ceo&#xff0c;做老师&#xff0c;上工地搬砖 七十二变&#xff0c;体验人生百态 操作很简单&#xff0c;只需要一个comfyUI工作流&#xff0c;你就能任意生成…

Studying-CodeTop | 3. 无重复字符的最长子串、206. 反转链表、146. LRU 缓存

目录 3. 无重复字符的最长子串 206. 反转链表 146. LRU 缓存 解题过程&#xff1a; 3. 无重复字符的最长子串 题目&#xff1a;3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 学习&#xff1a;本题题意很好理解&#xff0c;我们需要从所有不含有重复…

Linux 软件编程学习第十七天

1.select的缺点&#xff1a; 1.select监听的文件描述符集合是一个数组&#xff0c;有上限&#xff08;1024个&#xff09; 2.select监听的文件描述符集合在应用层&#xff0c;内核层监听事件后需要传递给用户层带来资源开销 3.select需要用户手动查找产生事件的文件…

数据复制一(主从复制详解)

目录 一、主从复制 二、同步复制和异步复制 三、节点失效处理方案 四、复制日志的实现 五、复制滞后问题 读自己的写 单调读 前缀一致读 数据复制就是相同的数据在多台机器上传输&#xff0c;多台机器可以在一个机房也不可以跨区域。通过数据复制有以下好处&#xff1a…

「数组」希尔排序 / 区间增量优化(C++)

目录 概述 思路 核心概念&#xff1a;增量d 算法过程 流程 Code 优化方案 区间增量优化 Code(pro) 复杂度 概述 我们在「数组」冒泡排序|选择排序|插入排序 / 及优化方案&#xff08;C&#xff09;中讲解了插入排序。 它有这么两个特点&#xff1a; ①待排序元素较…