JavaScript DOM与元素操作

news2025/4/1 16:46:45

目录

DOM 树、DOM 对象、元素操作

一、DOM 树与 DOM 对象

二、获取 DOM 元素

1. 基础方法

2. 现代方法(ES6+)

三、修改元素内容

四、修改元素常见属性

1. 标准属性

2. 通用方法

五、通过 style 修改样式

六、通过类名修改样式

1. className 属性

2. classList 方法(推荐)

七、获取和设置表单的值

1. 输入框(input、textarea)

2. 单选/复选框(radio、checkbox)

3. 下拉框(select)

八、自定义属性(data-*)

1. 定义与访问

2. 修改自定义属性

示例:全选反选案例


DOM 树、DOM 对象、元素操作

DOM(Document Object Model)是浏览器将 HTML 或 XML 文档解析为 树形结构 的编程接口,开发者可通过 JavaScript 动态操作网页内容、结构和样式。


一、DOM 树与 DOM 对象

  1. DOM 树

    • 定义:浏览器将 HTML 文档解析为 树形结构 的层级模型,每个 HTML 标签、属性、文本都对应树中的节点。

    • 结构:包含根节点(document)、元素节点、文本节点、属性节点等。

    • 作用:提供编程接口,让 JavaScript 动态操作网页内容。

  2. DOM 对象

    • 定义:DOM 树中的每个节点都是一个 对象,拥有属性和方法。

    • 类型

      • Element:元素节点(如 <div>)。

      • Text:文本节点。

      • Attr:属性节点。

      • Document:整个文档的入口。

  3. DOM 树示例

<!DOCTYPE html>
<html>
  <head>
    <title>DOM 示例</title>
  </head>
  <body>
    <h1>标题</h1>
    <p class="content">段落</p>
  </body>
</html>
document
├── html (元素节点)
│   ├── head (元素节点)
│   │   └── title (元素节点)
│   │       └── "DOM 示例" (文本节点)
│   └── body (元素节点)
│       ├── h1 (元素节点)
│       │   └── "标题" (文本节点)
│       └── p (元素节点)
│           ├── class="content" (属性节点)
│           └── "段落" (文本节点)
└── ...

二、获取 DOM 元素

1. 基础方法

方法返回类型示例
document.getElementById()单个元素document.getElementById("box")
document.getElementsByClassName()HTMLCollection(动态)document.getElementsByClassName("item")
document.getElementsByTagName()HTMLCollection(动态)document.getElementsByTagName("div")

2. 现代方法(ES6+)

方法返回类型示例
document.querySelector()单个元素document.querySelector(".container")
document.querySelectorAll()NodeList(静态)document.querySelectorAll("li")

区别

  • 动态集合(如 HTMLCollection):元素变化时自动更新。

    const items = document.getElementsByClassName("item");
    console.log(items.length); // 假设初始为 2
    document.body.appendChild(document.createElement("div")); // 动态集合长度自动更新
    console.log(items.length); // 3
  • 静态集合(如 NodeList):查询后不再更新。

    const list = document.querySelectorAll("li");
    console.log(list.length); // 假设初始为 3
    document.body.appendChild(document.createElement("li")); 
    console.log(list.length); // 仍为 3

三、修改元素内容

属性/方法说明示例
innerHTML获取或设置元素的 HTML 内容(解析标签)element.innerHTML = "<b>加粗</b>"
textContent获取或设置元素的文本内容(不解析标签)element.textContent = "纯文本"
innerText获取可见文本(考虑样式,性能较低)element.innerText = "可见文本"

注意

  • innerHTML 可能引发 XSS 攻击(避免插入未经验证的用户输入)。

  • textContent 性能优于 innerText


四、修改元素常见属性

方法说明示例
getAttribute()获取属性值element.getAttribute("href")
setAttribute()设置属性值element.setAttribute("class", "active")
removeAttribute()删除属性element.removeAttribute("disabled")
直接访问属性通过元素属性名快速访问(部分属性需特殊处理)element.id = "newId"

1. 标准属性

直接通过 DOM 对象属性操作:

element.id = "newId";          // 修改 id
element.className = "active";  // 修改 class(覆盖原有类)
element.href = "https://example.com"; // 修改链接

2. 通用方法

element.setAttribute("属性名", "值");  // 设置属性
element.getAttribute("属性名");       // 获取属性
element.removeAttribute("属性名");    // 删除属性

示例

const img = document.querySelector("img");
img.setAttribute("src", "new-image.jpg");
img.removeAttribute("alt");

五、通过 style 修改样式

方法说明示例
style 属性修改内联样式element.style.color = "red"
classList操作类名(添加、删除、切换)element.classList.add("active")
window.getComputedStyle()获取最终计算的样式(包括外部 CSS)getComputedStyle(element).fontSize

直接操作元素的 style 属性(修改内联样式):

element.style.color = "red";            // 单个样式
element.style.backgroundColor = "#fff"; // 驼峰命名
element.style.cssText = "color: red; font-size: 16px;"; // 批量设置

注意

  • 修改 style 只影响内联样式,优先级高于外部 CSS。

  • 频繁操作 style 可能触发重绘(性能敏感时需优化)。


六、通过类名修改样式

1. className 属性

直接覆盖所有类名:

element.className = "class1 class2"; // 覆盖原有类

2. classList 方法(推荐)

精细控制类名:

element.classList.add("new-class");     // 添加类
element.classList.remove("old-class");  // 删除类
element.classList.toggle("active");     // 切换类(存在则删除,否则添加)
element.classList.contains("active");   // 检查是否包含类

优势

  • 避免覆盖其他类名。

  • 支持链式调用:element.classList.add("a").remove("b")


七、获取和设置表单的值

1. 输入框(inputtextarea

const input = document.querySelector("input");
// 获取值
console.log(input.value);
// 设置值
input.value = "新内容";

2. 单选/复选框(radiocheckbox

const checkbox = document.querySelector("input[type=checkbox]");
// 获取选中状态
console.log(checkbox.checked); // true/false
// 设置选中状态
checkbox.checked = true;

3. 下拉框(select

const select = document.querySelector("select");
// 获取选中值
console.log(select.value);
// 设置选中值
select.value = "option2";

八、自定义属性(data-*

1. 定义与访问

HTML 中定义自定义属性:

<div id="user" data-id="123" data-user-name="Alice"></div>

JavaScript 通过 dataset 访问:

const user = document.getElementById("user");
console.log(user.dataset.id);          // "123"
console.log(user.dataset.userName);    // "Alice"(驼峰命名转换)

2. 修改自定义属性

user.dataset.id = "456";            // 修改 data-id
user.dataset.userRole = "admin";    // 添加 data-user-role
delete user.dataset.userName;       // 删除 data-user-name

注意

  • 属性名需符合 data-* 格式。

  • dataset 会自动将短横线命名转为驼峰式(如 data-user-name → userName)。


示例:全选反选案例

<body>
  <table>
    <tr>
      <th class="allCheck">
        <input type="checkbox" name="" id="checkAll"> <span class="all">全选</span>
      </th>
      <th>商品</th>
      <th>商家</th>
      <th>价格</th>
    </tr>
    <tr>
      <td>
        <input type="checkbox" name="check" class="ck">
      </td>
      <td>小米手机</td>
      <td>小米</td>
      <td>¥1999</td>
    </tr>
    <tr>
      <td>
        <input type="checkbox" name="check" class="ck">
      </td>
      <td>小米净水器</td>
      <td>小米</td>
      <td>¥4999</td>
    </tr>
    <tr>
      <td>
        <input type="checkbox" name="check" class="ck">
      </td>
      <td>小米电视</td>
      <td>小米</td>
      <td>¥5999</td>
    </tr>
  </table>
  <script>
    const checkAll = document.querySelector('#checkAll')
    const checks = document.querySelectorAll('.ck')
    checkAll.addEventListener('click', function () {
      for (let i = 0; i < checks.length; i++) {
        checks[i].checked = checkAll.checked
      }
    })
    for (let i = 0; i < checks.length; i++) {
      checks[i].addEventListener('click', function () {
        checkAll.checked = document.querySelectorAll('.ck:checked').length === checks.length
      })
    }
  </script>
</body>

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

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

相关文章

ARM向量表

向量表作用说明RVBAR在 AArch64 中&#xff0c;重置向量不再是异常向量表的一部分。 有复位向量的专用配置输入引脚和寄存器。在 AArch64 中&#xff0c;处理器从 IMPLEMENTAION‑DEFINED 地址开始执行&#xff0c; 该地址由硬件输入引 脚RVBARADDR定义&#xff0c; 可以通过 R…

leetcode刷题日记——除自身以外数组的乘积

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 题目要求获取数组中每个元素除自己以外的各元素的乘积最简单的方法就是算出数组所有元素的乘积&#xff0c;然后除以自身&#xff0c;即可得到除自身外各元素的乘积 但要考虑到其自身为0的情况&#xff0c;即当期自身为0时&am…

【信奥一本通提高篇】基础算法之贪心算法

原文 https://bbs.fmcraft.top/blog/index.php/archives/22/ 贪心算法 概述 近年来的信息学竞赛试题&#xff0c;经常出现求一个问题的可行解或最优解的题目。这类问题就是我们通常所说的最优化问题。贪心算法是求解这类问题的一种常用算法。在众多的算法中&#xff0c;贪心…

PyQt6实例_批量下载pdf工具_批量pdf网址获取

目录 前置&#xff1a; 步骤&#xff1a; step one 安装包 step two 获取股票代码 step three 敲代码&#xff0c;实现 step four 网址转pdf网址 视频 前置&#xff1a; 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头&#xff0c;放在 【PyQt6实例】 专栏 2 本节讲…

KMeans算法案例

KMeans算法案例 案例介绍 已知&#xff1a;客户性别、年龄、年收入、消费指数 需求&#xff1a;对客户进行分析&#xff0c;找到业务突破口&#xff0c;寻找黄金客户 数据集共包含顾客的数据, 数据共有 4 个特征, 数据共有 200 条。接下来&#xff0c;使用聚类算法对具有相似…

IDApro直接 debug STM32 MCU

使用IDA pro 逆向分析muc 固件的时候&#xff0c; 难免要进行一些动态的debug&#xff0c;来进一步搞清楚一些内存的数据、算法等&#xff0c;这时候使用远程debug 的方式直接在mcu上进行debug 最合适不过了。 不过有个前提条件就是一般来说有的mcu 会被运行中的代码屏蔽 RDP、…

六十天前端强化训练之第三十六天之E2E测试(Cypress)大师级完整指南

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、知识讲解 1. E2E测试核心概念 2. Cypress框架特性 3. 工作原理 4. 测试金字塔定位 二、核心代码示例&#xff1a;用户登录全流程测试 三、实现效果展示 四、学习要…

20250330-傅里叶级数专题之离散傅里叶变换(5/6)

5. 傅里叶级数专题之离散傅里叶变换 推荐视频: 工科生以最快的速度理解离散傅立叶变换(DFT) 哔哩哔哩 20250328-傅里叶级数专题之数学基础(0/6)-CSDN博客20250330-傅里叶级数专题之傅里叶级数(1/6)-CSDN博客20250330-傅里叶级数专题之傅里叶变换(2/6)-CSDN博客20250330-傅里叶…

3.29:数据结构-绪论线性表-上

一、时间复杂度 1、ADT 2、定义法计算时间复杂度&#xff1a;统计核心语句的总执行次数 &#xff08;1&#xff09;例题1&#xff0c;与2022年的真题对比着写 此题关键在于求和公式的转化&#xff0c;类型为&#xff1a;线性循环嵌套非线性循环 2022年那道题如果考场上实在脑…

大模型架构记录13【hr agent】

一 Function calling 函数调用 from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv())from openai import OpenAI import jsonclient OpenAI()# Example dummy function hard coded to return the same weather # In production, this could be your back…

conda 清除 tarballs 减少磁盘占用 、 conda rename 重命名环境、conda create -n qwen --clone 当前环境

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 conda clean --tarballsconda rename 重命名环境conda create -n qwen --clone …

pycharm相对路径引用方法

用于打字不方便&#xff0c;以下直接手写放图&#xff0c;直观理解

新能源智慧灯杆的智能照明系统如何实现节能?

叁仟新能源智慧灯杆的智能照明系统可通过以下多种方式实现节能&#xff1a; 智能调光控制 光传感器技术&#xff1a;在灯杆上安装光传感器&#xff0c;实时监测周围环境的光照强度。当环境光线充足时&#xff0c;如白天或有其他强光源时&#xff0c;智能照明系统会自动降低路…

Jenkins教程(自动化部署)

Jenkins教程(自动化部署) 1. Jenkins是什么&#xff1f; Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;广泛用于项目开发&#xff0c;具有自动化构建、测试和部署等功能。Jenkins用Java语言编写&#xff0c;可在Tomcat等流行的servlet容器中运行&…

行业智能体大爆发,分布式智能云有解

Manus的一夜爆红&#xff0c;在全球范围内引爆关于AI智能体的讨论。 与过去一般的AI助手不同&#xff0c;智能体&#xff08;AI Agent&#xff09;并非只是被动响应&#xff0c;而是主动感知、决策并执行的应用。Gartner预测&#xff0c;到2028年&#xff0c;15%的日常工作决策…

日语Learn,英语再认识(5)

This is a dedicated function — it exists solely to solve this case. This is a dedicated function. It’s a dedicated method for solving this case. 其他备选词&#xff08;但没dedicated精准&#xff09;&#xff1a; special → 含糊&#xff0c;有时只是“特别”…

【区块链安全 | 第十四篇】类型之值类型(一)

文章目录 值类型布尔值整数运算符取模运算指数运算 定点数地址&#xff08;Address&#xff09;类型转换地址的成员balance 和 transfersendcall&#xff0c;delegatecall 和 staticcallcode 和 codehash 合约类型&#xff08;Contract Types&#xff09;固定大小字节数组&…

音视频入门基础:MPEG2-TS专题(25)——通过FFmpeg命令使用UDP发送TS流

一、通过FFmpeg命令使用UDP发送TS流 通过以下FFmpeg命令可以将一个mp4文件转换为ts封装&#xff0c;并基于UDP发送&#xff08;推流&#xff09;&#xff1a; ffmpeg.exe -re -i input.mp4 -vcodec copy -acodec copy -f mpegts udp://127.0.0.1:1234 其中&#xff1a; “in…

Error in torch with streamlit

报错信息: This is the error which is a conflict between torch and streamlit: Examining the path of torch.classes raised: Tried to instantiate class path.path’, but it does not exist! Ensure that it is registered via torch::class Steps to reproduce: py…

网络基础知识介绍

目录 一、计算机网络背景与发展 1.1 计算机网络的背景 ​编辑1.2 计算机网络的发展历程 二、网络协议 2.1 认识网络协议 2.3 协议分层 2.4 OSI七层模型 2.5 TCP/IP 五层(或四层)模型 三、网络传输基本流程 3.1 网络传输流…