JavaScript DOM与元素操作

目录

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.mzph.cn/bicheng/75091.shtml

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

相关文章

单元测试的编写

Python 单元测试示例 在 Python 中&#xff0c;通常使用 unittest 模块来编写单元测试。以下是一个简单的示例&#xff1a; 示例代码&#xff1a;calculator.py # calculator.py def add(a, b):return a bdef subtract(a, b):return a - b 单元测试代码&#xff1a;test_c…

大模型学习:从零到一实现一个BERT微调

目录 一、准备阶段 1.导入模块 2.指定使用的是GPU还是CPU 3.加载数据集 二、对数据添加词元和分词 1.根据BERT的预训练&#xff0c;我们要将一个句子的句头添加[CLS]句尾添加[SEP] 2.激活BERT词元分析器 3.填充句子为固定长度 代码解释&#xff1a; 三、数据处理 1.…

10组时尚复古美学自然冷色调肖像电影照片调色Lightroom预设 De La Mer – Nautical Lightroom Presets

De La Mer 预设系列包含 10 种真实的调色预设&#xff0c;适用于肖像、时尚和美术。为您的肖像摄影带来电影美学和个性&#xff01; De La Mer 预设非常适合专业人士和业余爱好者&#xff0c;可在桌面或移动设备上使用&#xff0c;为您的摄影项目提供轻松的工作流程。这套包括…

SDL多窗口多线程渲染技术解析

SDL多窗口多线程渲染技术解析 技术原理 SDL多线程模型与窗口管理 SDL通过SDL_Thread结构体实现跨平台线程管理。在多窗口场景中,每个窗口需关联独立的渲染器,且建议遵循以下原则: 窗口与渲染器绑定:每个窗口创建时生成专属渲染器(SDL_CreateRenderer),避免跨线程操作…

QT 跨平台发布指南

一、Windows 平台发布 1. 使用 windeployqt 工具 windeployqt --release --no-compiler-runtime your_app.exe 2. 需要包含的文件 应用程序 .exe 文件 Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll 等 Qt 库 platforms/qwindows.dll 插件 styles/qwindowsvistastyle.dll (如果使…

L2-037 包装机 (分数25)(详解)

题目链接——L2-037 包装机 问题分析 这个题目就是模拟了物品在传送带和筐之间的传送过程。传送带用队列模拟&#xff0c;筐用栈模拟。 输入 3 4 4 GPLT PATA OMSA 3 2 3 0 1 2 0 2 2 0 -1输出 根据上述操作&#xff0c;输出的物品顺序是&#xff1a; MATA样例分析 初始…

机器学习的一百个概念(4)下采样

前言 本文隶属于专栏《机器学习的一百个概念》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…

qt6下配置qopengl

qt部件选择 Qt 6&#xff1a;需要手动选择 Qt Shader Tools 和 Qt 5 Compatibility Module&#xff08;如果需要兼容旧代码&#xff09; cmake文件 cmake_minimum_required(VERSION 3.16) # Qt6 推荐最低 CMake 3.16 project(myself VERSION 0.1 LANGUAGES CXX)set(CMAKE_A…

数据安全系列4:密码技术的应用-接口调用的身份识别

传送门 数据安全系列1&#xff1a;开篇 数据安全系列2&#xff1a;单向散列函数概念 数据安全系列3&#xff1a;密码技术概述 什么是认证&#xff1f; 一谈到认证&#xff0c;多数人的反应可能就是"用户认证" 。就是应用系统如何识别用户的身份&#xff0c;直接…

STL之map和set

1. 关联式容器 vector、list、deque、 forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身。 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是结…

Vue3 其它API Teleport 传送门

Vue3 其它API Teleport 传送门 在定义一个模态框时&#xff0c;父组件的filter属性会影响子组件的position属性&#xff0c;导致模态框定位错误使用Teleport解决这个问题把模态框代码传送到body标签下

C++练习

1.将File练习题&#xff0c;内部的FILE*描述符&#xff0c;改成int描述符 2。写一个类Fifo管道类。提高难度&#xff0c;什么都不提示。只要求&#xff1a;使用自己编写的Fifo类对象&#xff0c;实现2个终端之间互相聊天 file.cpp #include <iostream> #include <c…

《Python Web网站部署应知应会》No4:基于Flask的调用AI大模型的高性能博客网站的设计思路和实战(上)

基于Flask的调用AI大模型的高性能博客网站的设计思路和实战&#xff08;上&#xff09; 摘要 本文详细探讨了一个基于Flask框架的高性能博客系统的设计与实现&#xff0c;该系统集成了本地AI大模型生成内容的功能。我们重点关注如何在高并发、高负载状态下保持系统的高性能和…

实现一个简易版的前端监控 SDK

【简易版的前端监控系统】 1、Promise的错误如何监控&#xff1f;–promise不是所有都是接口请求 2、接口的报错如何监控&#xff1f;–全局监控sdk&#xff0c;不改动公共的请求方法、不改动业务代码&#xff1b;一般接口使用axios请求 3、资源的报错如何监控&#xff1f; 4、…

【操作系统】软中断vs硬中断

在操作系统中&#xff0c;中断&#xff08;Interrupt&#xff09; 是 CPU 响应外部事件的重要机制&#xff0c;分为 硬中断&#xff08;Hardware Interrupt&#xff09; 和 软中断&#xff08;Software Interrupt&#xff09;。它们的核心区别在于 触发方式 和 处理机制。 1. 硬…

力扣刷题-热题100题-第27题(c++、python)

21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/merge-two-sorted-lists/description/?envTypestudy-plan-v2&envIdtop-100-liked 常规法 创建一个新链表&#xff0c;遍历list1与list2&#xff0c;将新链表指向list1与list2…

Python包下载路径 Chrome用户数据 修改到非C盘

查看 site-packages 是否能通过命令行完成&#xff1f; 可以&#xff0c;使用以下命令&#xff08;不需写脚本&#xff09;&#xff1a; python -m site输出包含&#xff1a; sys.path site-packages 路径&#xff08;全局和用户级&#xff09; 如果只想看安装路径&#…

【鸿蒙5.0】鸿蒙登录界面 web嵌入(隐私页面加载)

在鸿蒙应用中嵌入 Web 页面并加载隐私页面&#xff0c;可借助 WebView 组件来实现。以下是一个完整示例&#xff0c;展示如何在鸿蒙 ArkTS 里嵌入 Web 页面并加载隐私政策页面。 在 HarmonyOS 应用开发中&#xff0c;如果你希望嵌入一个网页&#xff0c;并且特别关注隐私页面加…

AI加Python的文本数据情感分析流程效果展示与代码实现

本文所使用数据来自于梯田景区评价数据。 一、数据预处理 数据清洗 去除重复值、空值及无关字符(如表情符号、特殊符号等)。 提取中文文本,过滤非中文字符。 统一文本格式(如全角转半角、繁体转简体)。 中文分词与去停用词 使用 jieba 分词工具进行分词。 加载自定义词…

Microi吾码界面设计引擎之基础组件用法大全【内置组件篇·上】

&#x1f380;&#x1f380;&#x1f380; microi-pageengine 界面引擎系列 &#x1f380;&#x1f380;&#x1f380; 一、Microi吾码&#xff1a;一款高效、灵活的低代码开发开源框架【低代码框架】 二、Vue3项目快速集成界面引擎 三、Vue3 界面设计插件 microi-pageengine …