深入理解 DOM 元素

news2025/3/10 14:42:25

深入理解 DOM 元素:构建动态网页的基石

在网页开发的世界里,DOM(Document Object Model,文档对象模型)元素宛如一座桥梁,连接着静态的 HTML 结构与动态的 JavaScript 交互逻辑。它让原本呆板的网页变得鲜活生动,能够实时响应用户的每一个操作。今天,就让我们一同深入探索 DOM 元素的奥秘。

一、DOM 元素究竟是什么?

想象一下,当浏览器加载一个 HTML 文件时,它会按照 HTML 标记构建出一个树形结构,这个树状图中的每一个节点,对应的就是一个 DOM 元素。从根节点 <html> 开始,层层分支,包含了 <head><body>,再细化到各种文本标签如 <p><div><img> 等等。这些元素不仅承载着网页的视觉呈现内容,如文字、图片、布局样式,更重要的是,它们为 JavaScript 提供了操作的 “把柄”,使得我们可以在代码层面随心所欲地改变网页的状态。

例如,一个简单的 HTML 页面:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>DOM 示例</title>
</head>

<body>
    <h1>欢迎来到我的网页</h1>
    <p id="intro">这是一段介绍性的文字。</p>
    <img src="image.jpg" alt="示例图片" id="myImage">
</body>

</html>

在这个页面里,<h1><p><img> 都是独立的 DOM 元素,它们各自有属性(如 idsrcalt)和包含的文本内容(对于可包含文本的元素而言),共同编织成了网页的基础架构。

二、获取 DOM 元素:开启交互之门

JavaScript 要操作 DOM 元素,首先得找到它们。常见的获取方式有多种:

  1. document.getElementById():这是最基本也是最常用的方法之一,通过元素的 id 属性来精准定位。就像我们上面例子中的 <p> 元素设置了 id="intro",在 JavaScript 中就可以这样获取:

const introParagraph = document.getElementById('intro');
console.log(introParagraph.textContent); // 输出:这是一段介绍性的文字。

  1. document.getElementsByTagName():按照标签名称来获取一组元素。如果想获取页面上所有的 <p> 元素,可以:
const allParagraphs = document.getElementsByTagName('p');
for (let i = 0; i < allParagraphs.length; i++) {
    console.log(allParagraphs[i].textContent);
}

  1. document.getElementsByClassName():依据类名检索元素,适用于给多个需要统一操作的元素赋予相同类名的场景。例如,若有多个元素都带有 highlight 类:

const highlightedElements = document.getElementsByClassName('highlight');
for (let i = 0; i < highlightedElements.length; i++) {
    highlightedElements[i].style.backgroundColor = 'yellow';
}

  1. 更现代的 document.querySelector() 和 document.querySelectorAll():前者返回匹配指定 CSS 选择器的第一个元素,后者返回所有匹配的元素集合,它们支持复杂的选择器语法,如 #id.classelement > child 等,提供了极大的灵活性。

const specificDiv = document.querySelector('div#main-content'); // 获取 id 为 main-content 的 div
const allButtons = document.querySelectorAll('button'); // 获取所有按钮元素

三、操作 DOM 元素:动态改变网页

一旦拿到了 DOM 元素,就能对它们施展各种 “魔法”。

  1. 更改元素内容:可以修改元素内部的文本或 HTML 代码。对于文本,使用 textContent 属性:
const updateText = document.getElementById('intro');
updateText.textContent = '这段文字已经被更新,是不是很神奇?';

要是想替换元素内的 HTML 片段,就得用 innerHTML,但要小心 XSS(跨站脚本攻击)风险,避免使用用户输入的不可信内容直接赋值:

const divElement = document.createElement('div');
divElement.innerHTML = '<strong>新的加粗内容</strong>';
document.body.appendChild(divElement);

  1. 操作元素样式:通过修改 style 属性来即时改变元素外观。比如改变颜色、字体大小、位置等
const myImage = document.getElementById('myImage');
myImage.style.border = '2px solid red';
myImage.style.width = '50%'; // 调整图片宽度为容器的 50%

还可以利用 classList 属性来添加、移除或切换 CSS 类,实现样式的动态切换,这比直接操作 style 更符合 CSS 的模块化管理理念

const button = document.createElement('button');
button.textContent = '点击变色';
button.addEventListener('click', function() {
    button.classList.toggle('active'); // 每次点击切换 active 类,用于切换样式
});
document.body.appendChild(button);

  1. 创建与删除元素:使用 document.createElement() 生成新元素,再用 appendChild() 将其添加到指定父元素中;要移除元素,则调用 removeChild()。假设要动态添加一个列表项:
const ul = document.createElement('ul');
const li = document.createElement('li');
li.textContent = '新的列表项';
ul.appendChild(li);
document.body.appendChild(ul);

// 若要删除刚添加的列表项
const parentUl = li.parentNode;
parentUl.removeChild(li);

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

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

相关文章

[数据分享第七弹]全球洪水相关数据集

洪水是一种常见的自然灾害&#xff0c;在全球范围内造成了极为严重的威胁。近年来&#xff0c;针对洪水事件的检测分析&#xff0c;以及对于洪水灾害和灾后恢复能力的研究日渐增多&#xff0c;也产生了众多洪水数据集。今天&#xff0c;我们一起来收集整理一下相关数据集。&…

MySQL 面试篇

MySQL相关面试题 定位慢查询 **面试官&#xff1a;**MySQL中&#xff0c;如何定位慢查询? 我们当时做压测的时候有的接口非常的慢&#xff0c;接口的响应时间超过了2秒以上&#xff0c;因为我们当时的系统部署了运维的监控系统Skywalking &#xff0c;在展示的报表中可以看到…

【Andrej Karpathy 神经网络从Zero到Hero】--2.语言模型的两种实现方式 (Bigram 和 神经网络)

目录 统计 Bigram 语言模型质量评价方法 神经网络语言模型 【系列笔记】 【Andrej Karpathy 神经网络从Zero到Hero】–1. 自动微分autograd实践要点 本文主要参考 大神Andrej Karpathy 大模型讲座 | 构建makemore 系列之一&#xff1a;讲解语言建模的明确入门&#xff0c;演示…

Android MVC、MVP、MVVM三种架构的介绍和使用。

写在前面&#xff1a;现在随便出去面试Android APP相关的工作&#xff0c;面试官基本上都会提问APP架构相关的问题&#xff0c;用Java、kotlin写APP的话&#xff0c;其实就三种架构MVC、MVP、MVVM&#xff0c;MVC和MVP高度相似&#xff0c;区别不大&#xff0c;MVVM则不同&…

python使用django搭建图书管理系统

大家好,你们喜欢的梦幻编织者回来了 随着计算机网络和信息技术的不断发展&#xff0c;人类信息交流的方式从根本上发生了改变&#xff0c;计算机技术、信息化技术在各个领域都得到了广泛的应用。图书馆的规模和数量都在迅速增长&#xff0c;馆内藏书也越来越多&#xff0c;管理…

JavaScript系列06-深入理解 JavaScript 事件系统:从原生事件到 React 合成事件

JavaScript 事件系统是构建交互式 Web 应用的核心。本文从原生 DOM 事件到 React 的合成事件&#xff0c;内容涵盖&#xff1a; JavaScript 事件基础&#xff1a;事件类型、事件注册、事件对象事件传播机制&#xff1a;捕获、目标和冒泡阶段高级事件技术&#xff1a;事件委托、…

大话机器学习三大门派:监督、无监督与强化学习

以武侠江湖为隐喻&#xff0c;系统阐述了机器学习的三大范式&#xff1a;​监督学习&#xff08;少林派&#xff09;​凭借标注数据精准建模&#xff0c;擅长图像分类等预测任务&#xff1b;无监督学习&#xff08;逍遥派&#xff09;​通过数据自组织发现隐藏规律&#xff0c;…

win11编译llama_cpp_python cuda128 RTX30/40/50版本

Geforce 50xx系显卡最低支持cuda128&#xff0c;llama_cpp_python官方源只有cpu版本&#xff0c;没有cuda版本&#xff0c;所以自己基于0.3.5版本源码编译一个RTX 30xx/40xx/50xx版本。 1. 前置条件 1. 访问https://developer.download.nvidia.cn/compute/cuda/12.8.0/local_…

FY-3D MWRI亮温绘制

1、FY-3D MWRI介绍 风云三号气象卫星&#xff08;FY-3&#xff09;是我国自行研制的第二代极轨气象卫星&#xff0c;其有效载荷覆 盖了紫外、可见光、红外、微波等频段&#xff0c;其目标是实现全球全天候、多光谱、三维定量 探测&#xff0c;为中期数值天气预报提供卫星观测数…

Codeforces1929F Sasha and the Wedding Binary Search Tree

目录 tags中文题面输入格式输出格式样例输入样例输出说明 思路代码 tags 组合数 二叉搜索树 中文题面 定义一棵二叉搜索树满足&#xff0c;点有点权&#xff0c;左儿子的点权 ≤ \leq ≤ 根节点的点权&#xff0c;右儿子的点权 ≥ \geq ≥ 根节点的点权。 现在给定一棵 …

HBuilder X 使用 TortoiseSVN 设置快捷键方法

HBuilder X 使用 TortoiseSVN 设置快捷键方法 单文件&#xff1a;(上锁&#xff0c;解锁&#xff0c;提交&#xff0c;更新) 安装好 TortoiseSVN &#xff0c;或者 按图操作&#xff1a; 1&#xff0c;工具栏中 【自定义快捷键】 2&#xff0c;点击 默认的快捷键设置&…

Java jar包后台运行方式详解

目录 一、打包成 jar 文件二、后台运行 jar 文件三、示例四、总结在 Java 开发中,我们经常需要将应用程序打包成可执行的 jar 文件,并在后台运行。这种方式对于部署长时间运行的任务或需要持续监听事件的应用程序非常重要。本文将详细介绍如何实现 Java jar 包的后台运行,并…

Mysql5.7-yum安装和更改mysql数据存放路径-2020年记录

记录下官网里用yum rpm源安装mysql, 1 官网下载rpm https://dev.mysql.com/downloads/repo/yum/ https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html&#xff08;附官网操作手册&#xff09; wget https://repo.mysql.com//mysql80-community-release…

[项目]基于FreeRTOS的STM32四轴飞行器: 七.遥控器按键

基于FreeRTOS的STM32四轴飞行器: 七.遥控器 一.遥控器按键摇杆功能说明二.摇杆和按键的配置三.按键扫描 一.遥控器按键摇杆功能说明 两个手柄四个ADC。 左侧手柄&#xff1a; 前后推为飞控油门&#xff0c;左右推为控制飞机偏航角。 右侧手柄&#xff1a; 控制飞机飞行方向&a…

Android15使用FFmpeg解码并播放MP4视频完整示例

效果: 1.编译FFmpeg库: 下载FFmpeg-kit的源码并编译生成安装平台库 2.复制生成的FFmpeg库so文件与包含目录到自己的Android下 如果没有prebuiltLibs目录,创建一个,然后复制 包含目录只复制arm64-v8a下

安装树莓派3B+环境(嵌入式开发)

一、环境配置 1、下载树莓派镜像工具 点击进入下载连接 进入网站&#xff0c;点击下载即可。 2、配置wifi及ssh 将SD卡插入读卡器&#xff0c;再接入电脑&#xff0c;随后打开Raspberry Pi Imager下载工具&#xff0c; 选择Raspberry Pi 3 选择64位的操作系统 选择SD卡 选择…

p5.js:sound(音乐)可视化,动画显示音频高低变化

本文通过4个案例介绍了使用 p5.js 进行音乐可视化的实践&#xff0c;包括将音频振幅转化为图形、生成波形图。 承上一篇&#xff1a;vite&#xff1a;初学 p5.js demo 画圆圈 cd p5-demo copy .\node_modules\p5\lib\p5.min.js . copy .\node_modules\p5\lib\addons\p5.soun…

Linux下安装elasticsearch(Elasticsearch 7.17.23)

Elasticsearch 是一个分布式的搜索和分析引擎&#xff0c;能够以近乎实时的速度存储、搜索和分析大量数据。它被广泛应用于日志分析、全文搜索、应用程序监控等场景。 本文将带你一步步在 Linux 系统上安装 Elasticsearch 7.17.23 版本&#xff0c;并完成基本的配置&#xff0…

【The Rap of China】2018

中国新说唱第一季&#xff0c;2018 2018年4月13日&#xff0c;该节目通过官方微博宣布&#xff0c;其第二季将更名为《中国新说唱》。 《中国新说唱2018》由张震岳、MC Hotdog、潘玮柏、邓紫棋、WYF 担任明星制作人&#xff1b; 艾热获得冠军、那吾克热玉素甫江获得亚军、ICE…

通义万相2.1开源版本地化部署攻略,生成视频再填利器

2025 年 2 月 25 日晚上 11&#xff1a;00 通义万相 2.1 开源发布&#xff0c;前两周太忙没空搞它&#xff0c;这个周末&#xff0c;也来本地化部署一个&#xff0c;体验生成效果如何&#xff0c;总的来说&#xff0c;它在国内文生视频、图生视频的行列处于领先位置&#xff0c…