当前位置: 首页 > article >正文

DOM 基础全面解析

系列文章目录《JavaScript 基础与进阶笔记》前期偏基础巩固与常见面试点后续进入闭包、异步、工程化等进阶主题第 01 篇数据类型与类型判断第 02 篇变量声明与作用域第 03 篇闭包与高阶函数第 04 篇函数工厂第 05 篇this 指向与绑定第 06 篇原型与原型链第 07 篇类与继承第 08 篇JS 执行机制与异步队列第 09 篇数组常用方法第 10 篇字符串算法第 11 篇常见手写题合集上第 12 篇常见手写题合集下第 13 篇Promise 与 async/await第 14 篇数据结构基础第 15 篇垃圾回收与内存第 16 篇DOM 基础全面解析本文文章目录系列文章目录前言一、DOM 与 DOM 树1.1 什么是 DOM1.2 DOM 树 vs 渲染树先建立概念二、节点类型三、查询 API 演进3.1 早期 API仍常见3.2 现代 API推荐3.3 遍历与关系属性3.4 API 选型建议四、HTMLCollection vs NodeList五、增删改与内容5.1 创建与插入5.2 删除与替换5.3 textContent vs innerHTML vs innerText六、Attribute vs Property6.1 区别6.2 典型易混例6.3 data-* 与 dataset6.4 何时用哪套 API七、动态脚本与 HTML 解析7.1 async 与 defer7.2 DOMContentLoaded vs load八、classList 与样式入门九、速查表十、易混淆点归纳十一、思考与练习总结前言系列从 JS 语言机制进入第三阶段DOM、CSS 与渲染。本篇打地基DOM 是什么、有哪些节点类型、如何查询与增删改以及面试常问的attributevsproperty、HTMLCollectionvsNodeList、脚本如何影响 HTML 解析。现代框架虽少直接操作 DOM但排查问题、写原生逻辑、理解性能与事件仍离不开这些 API。性能与渲染流水线放在第 17 篇展开。一、DOM 与 DOM 树1.1 什么是 DOMDOMDocument Object Model是浏览器将 HTML/XML 文档解析成的树形对象模型用 JavaScript 可读结构、改内容、绑事件。每个标签、文本、注释对应树中的一个节点Node。Document └── html (Element) ├── head (Element) │ └── title (Element) → 页面标题 (Text) └── body (Element) ├── div#app (Element) │ └── p (Element) → hello (Text) └── script (Element)1.2 DOM 树 vs 渲染树先建立概念DOM 树渲染树Render Tree内容文档中所有节点仅可见、需绘制的节点例display: none的 div仍在DOM通常不在渲染树操作对象document、querySelector等浏览器内部JS 不直接改第 17 篇会细讲 Layout / Paint本篇只需知道改 DOM 可能触发后续渲染流程。二、节点类型常用nodeType/nodeName区分类型nodeType说明示例Document9文档根documentElement1元素节点div、inputText3文本元素内的文字Comment8注释!-- --DocumentFragment11文档片段批量插入的「轻量容器」document.nodeType;// 9document.body.nodeType;// 1document.body.firstChild?.nodeType;// 可能是 3Text或 1Element易混点击事件里event.target有时是文本节点nodeType 3需要element.closest(li)找到目标元素第 18 篇事件篇会再提。三、查询 API 演进3.1 早期 API仍常见document.getElementById(app);// 单个 Element 或 nulldocument.getElementsByTagName(div);// HTMLCollection动态document.getElementsByClassName(item);// HTMLCollection动态document.getElementsByName(gender);// HTMLCollection常用于 radio特点getElementById返回单个元素或null不是集合。getElementsBy*返回HTMLCollection** live 集合**DOM 变化时集合自动更新。3.2 现代 API推荐document.querySelector(#app .item);// 第一个匹配或 nulldocument.querySelectorAll(ul li);// NodeList静态快照见下document.querySelector(:scope li);// 相对当前元素元素上调用时constuldocument.querySelector(ul);ul.querySelector(li.active);querySelectorAll返回NodeList在多数浏览器实现中为静态列表查询后增删节点不会反映到已有 NodeList与 live 的 HTMLCollection 不同。3.3 遍历与关系属性consteldocument.querySelector(.box);el.parentElement;el.children;// 仅 Element 子节点HTMLCollectionel.childNodes;// 含 Text/CommentNodeListel.nextElementSibling;el.previousElementSibling;el.closest(.wrap);// 向上找匹配选择器的祖先3.4 API 选型建议场景推荐已知 idgetElementById或#idCSS 选择器、复杂匹配querySelector/querySelectorAll需 live 跟踪子元素变化知悉成本后用getElementsBy*或MutationObserver在组件根内查询容器上调用querySelector避免全局扫描四、HTMLCollection vs NodeList对比HTMLCollectionNodeList典型来源getElementsByTagName、childrenquerySelectorAll、childNodes是否 live通常是 livequerySelectorAll为 staticchildNodes等可能 live数组方法较新版本可[...col]、forEach同上面试一句话live 集合在循环中若增删 DOM可能死循环或漏项静态 NodeList 是查询时刻快照constlistdocument.getElementsByTagName(li);console.log(list.length);// 3constnewLidocument.createElement(li);document.querySelector(ul).appendChild(newLi);console.log(list.length);// 4 — live自动更新conststaticListdocument.querySelectorAll(li);// 此后 append 新 listaticList.length 不变实践遍历并删除子节点时用while (el.firstChild) el.removeChild(el.firstChild)或el.replaceChildren()避免 live 集合下标错乱。五、增删改与内容5.1 创建与插入constdivdocument.createElement(div);div.classNamecard;div.textContent安全文本;constuldocument.querySelector(ul);ul.append(div);// 末尾追加ul.prepend(div);// 开头若 div 已在树中会移动ul.insertBefore(div,ul.firstChild);// 批量DocumentFragmentconstfragdocument.createDocumentFragment();for(leti0;i100;i){constlidocument.createElement(li);li.textContenti;frag.appendChild(li);}ul.appendChild(frag);// 一次插入减少重排第 17 篇详述5.2 删除与替换el.remove();// 现代 APIparent.removeChild(el);// 传统el.replaceWith(newEl);el.replaceChildren();// 清空子节点5.3textContentvsinnerHTMLvsinnerTextAPI行为安全/性能textContent纯文本含隐藏元素文本防 XSS不解析 HTMLinnerHTML解析 HTML 字符串用户输入需消毒触发解析innerText近似「可见文本」受 CSS 影响可能触发布局计算el.textContentuserInput;// ✅ 展示用户输入el.innerHTMLuserInput;// ❌ 可能 XSS六、Attribute vs Property6.1 区别Attribute特性Property属性所在HTML 字符串 / DOM 特性层JS 对象上的属性类型多为字符串多为正确类型boolean、numberAPIgetAttribute/setAttributeel.xxx或el[prop]HTML 解析时部分 attribute 会同步到 propertyIDL 属性但二者不一定始终相等。6.2 典型易混例inputidagevalue18disabled/constinputdocument.querySelector(#age);input.getAttribute(value);// 18input.value;// 18propertyinput.value20;input.getAttribute(value);// 可能仍是 18 — 改 property 不总改 attributeinput.disabled;// truebooleaninput.getAttribute(disabled);// 或 disabled存在即可input.removeAttribute(disabled);input.disabled;// falseclassvsclassNameHTML 用classJS 用el.className或el.classListgetAttribute(class)也可。布尔 attributedisabled、checked、selected等存在即 true用 property 读写更自然。6.3data-*与datasetdivdata-user-id42data-roleadmin/divconsteldocument.querySelector(div);el.dataset.userId;// 42camelCaseel.dataset.role;// adminel.dataset.userId43;// 等价于 setAttribute(data-user-id, 43)注意dataset值均为字符串存对象请JSON.stringify。6.4 何时用哪套 API场景建议表单当前值input.valueproperty自定义数据标记data-*/dataset与服务器回显 HTML 一致必要时setAttribute样式类名classList.add/remove/toggle七、动态脚本与 HTML 解析浏览器解析 HTML 时遇到script的默认行为暂停HTML 解析阻塞解析器。下载若src并执行脚本。继续解析。CSS一般不阻塞 DOM 解析但会阻塞渲染避免无样式闪屏 FOUC。7.1async与deferscriptsrca.js/scriptscriptsrcb.jsdefer/scriptscriptsrcc.jsasync/script属性下载执行时机顺序无阻塞解析立即执行文档顺序defer并行下载HTML 解析完成后、DOMContentLoaded前保持顺序async并行下载下载完即执行不保证顺序实践依赖 DOM 且需按序defer独立统计/广告async内联脚本无 defer/async仍阻塞7.2DOMContentLoadedvsloaddocument.addEventListener(DOMContentLoaded,(){// DOM 树就绪可能尚未加载完图片});window.addEventListener(load,(){// 资源图片等大致加载完});八、classList 与样式入门el.classList.add(active);el.classList.remove(hidden);el.classList.toggle(open);el.classList.contains(active);// booleanel.style.colorred;// 行内 stylepropertyel.getAttribute(hidden);// attribute 层复杂样式优先CSS 类少直接改style多项利于维护与批量重排优化。九、速查表需求API按 idgetElementById/#idCSS 选择器querySelector(All)创建元素createElement批量插入DocumentFragment安全设文本textContent表单值.valueproperty自定义标记data-*/dataset类名classList不阻塞解析脚本defer/async十、易混淆点归纳DOM 树 ≠ 渲染树display: none仍在 DOM。HTMLCollection 常 live循环删节点要小心querySelectorAll 为静态。Attribute 是字符串层Property 是 JS 对象层value、checked等优先 property。innerHTML有 XSS 风险用户内容用textContent或消毒库。无 defer/async 的 script 阻塞解析CSS 阻塞渲染不阻塞 DOM 构建。Text 节点也会出现在childNodes中事件 target 可能是文本节点。十一、思考与练习1.getElementsByClassName与querySelectorAll返回集合live 行为有何不同解析前者HTMLCollection 通常 live后者NodeList 为查询快照后续 DOM 变更不更新旧列表。2.用户评论要插入页面用innerHTML还是textContent解析纯文本展示用textContent若必须渲染富文本需白名单过滤如 DOMPurify不可直接innerHTML userInput。3.input.getAttribute(value)与input.value在用户输入后一定相等吗解析不一定。用户改输入后valueproperty已变attribute可能仍是初始 HTML 值。4.三个script defer标签执行顺序解析按文档中出现顺序依次执行在 DOM 解析完成后。5.el.children与el.childNodes区别解析children仅Element子节点HTMLCollectionchildNodes含 Text、Comment 等NodeList。总结DOM是文档的树形对象模型常见节点有Document、Element、Text、DocumentFragment。查询现代优先querySelector(All)理解HTMLCollectionlive与NodeList多为 static。增删改createElement、append、remove、DocumentFragment内容用textContent更安全。Attribute vs Property表单状态、布尔特性用propertydata-*用dataset。脚本默认阻塞解析defer有序延后async下完即跑、无序。下一篇讲DOM 性能与渲染Reflow/Repaint/Composite、强制同步布局、DocumentFragment与渲染流水线。

相关文章:

DOM 基础全面解析

系列文章目录 《JavaScript 基础与进阶笔记》(前期偏基础巩固与常见面试点,后续进入闭包、异步、工程化等进阶主题) 第 01 篇:数据类型与类型判断第 02 篇:变量声明与作用域第 03 篇:闭包与高阶函数第 04…...

RAG+Agent+记忆图谱三重架构解析,2026年仅剩这4个工具通过企业级安全审计认证

更多请点击: https://codechina.net 第一章:RAGAgent记忆图谱三重架构解析,2026年仅剩这4个工具通过企业级安全审计认证 架构协同的本质逻辑 RAG 提供实时、可溯源的外部知识注入能力;Agent 负责任务分解、工具调用与多步推理闭…...

NotebookLM时间线功能深度解锁:5个被90%用户忽略的高阶技巧,今天必须掌握

更多请点击: https://codechina.net 第一章:NotebookLM时间线功能概览与核心价值 NotebookLM 的时间线(Timeline)功能是其区别于传统笔记工具的关键创新,它以可视化、可交互的方式呈现文档内容的演进脉络与语义关联。…...

鬼谷八荒2026官方正版最新版pc免费下载(看到请立即转存 资源随时失效)手机版通用

下载链接 逆天改命与八荒求道:解析《鬼谷八荒》的幕后历程、核心玩法与行业对比 在近年来的国产独立游戏浪潮中,修仙题材始终占据着举足轻重的地位。而在众多作品里,《鬼谷八荒》凭借其独特的画风与开放世界沙盒的定位,一度引发了…...

3个步骤快速掌握Py Eddy Tracker:海洋中尺度涡旋识别与追踪的完整解决方案

3个步骤快速掌握Py Eddy Tracker:海洋中尺度涡旋识别与追踪的完整解决方案 【免费下载链接】py-eddy-tracker Eddy identification and tracking 项目地址: https://gitcode.com/gh_mirrors/py/py-eddy-tracker Py Eddy Tracker是一个专门用于海洋中尺度涡旋…...

BGA翻新安全的核心风险—热损伤与机械失效底层逻辑

BGA(球栅阵列)芯片翻新是电子制造业降本增效、资源循环的重要工艺,广泛应用于服务器 CPU、手机基带芯片、车载处理器等高价值元器件修复场景。但 BGA 封装结构精密,焊点隐藏在芯片底部,翻新过程需经历多次高温加热、机…...

Taotoken用量看板如何帮助团队清晰掌握各模型消耗与成本分布

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken用量看板如何帮助团队清晰掌握各模型消耗与成本分布 对于项目管理者或团队负责人而言,在引入大模型能力后&…...

MSTP+VRRP+链路聚合简单配置

实验需求:1.存在两个用户业务网,分布为VLAN 10和VLAN 20,需要SW1作为VLAN 10根桥和VRRP-master设备2.SW2作为VLAN 20根桥和VRRP-master设备3.网段自行规划,全网可达配置思路:两条实例:需要在 MSTP 域中配置…...

asnumpy - 让昇腾NPU和NumPy无缝对接

刚学深度学习那会,最顺手的是 NumPy。各种矩阵运算、广播机制、索引操作,闭着眼睛都能写。 后来跑昇腾NPU,发现 NumPy 代码没法直接跑——torch.tensor 和 np.ndarray 不能混用,数据要手动转来转去,烦死了。 直到我发…...

终极AI图片分层工具:3分钟将任何图片转换为可编辑PSD图层

终极AI图片分层工具:3分钟将任何图片转换为可编辑PSD图层 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾经面对一张精美的插画或设计…...

SPT-AKI存档编辑器完整指南:快速定制你的离线塔科夫体验

SPT-AKI存档编辑器完整指南:快速定制你的离线塔科夫体验 【免费下载链接】SPT-AKI-Profile-Editor Программа для редактирования профиля игрока на сервере SPT-AKI 项目地址: https://gitcode.com/gh_mirrors…...

轻松实现颜色与数字的映射:Python 数据处理实战

在数据分析与日常数据处理中,我们经常需要将文本信息转换为数值型数据,尤其在颜色编码、分类标签等场景中尤为常见。 今天,我将分享一个简单实用的 Python 示例,演示如何利用 pandas 库将颜色名称映射为对应的数字,并将…...

免费网盘直链解析工具:九个主流网盘的高速下载完整解决方案

免费网盘直链解析工具:九个主流网盘的高速下载完整解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 /…...

抖音下载终极指南:免费无水印批量保存完整方案

抖音下载终极指南:免费无水印批量保存完整方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音…...

5G通信实战:手把手教你用Vivado LDPC IP核配置编码参数(附避坑指南)

5G通信实战:FPGA开发中的LDPC编解码参数配置全解析 在5G通信系统的开发过程中,LDPC(低密度奇偶校验)码作为物理层的关键技术之一,其实现质量直接影响着系统的传输性能和可靠性。对于使用Xilinx FPGA进行5G基带开发的工…...

终极iOS位置模拟解决方案:iFakeLocation跨平台免费使用指南

终极iOS位置模拟解决方案:iFakeLocation跨平台免费使用指南 【免费下载链接】iFakeLocation Simulate locations on iOS devices on Windows, Mac and Ubuntu. 项目地址: https://gitcode.com/gh_mirrors/if/iFakeLocation 你是否曾想过将iPhone定位到世界任…...

为OpenClaw智能体工作流配置Taotoken聚合端点的教程

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为OpenClaw智能体工作流配置Taotoken聚合端点的教程 OpenClaw是一款功能强大的智能体开发工具,它允许开发者构建和编排…...

基于Python + LLM的AI客服协作系统设计与实现

🧑‍💻 博主介绍 & 诚邀关注 作者:专注于 Java、Python、前端开发的技术博主 | 全网粉丝 30 万 在校期间协助导师完成毕业设计课题分类、论文格式初审及代码整理工作;工作后持续分享毕设思路,助力毕业生顺利完成…...

告别盲目复制粘贴:深度解析CW32固件库结构,让你的MDK工程更清晰

告别盲目复制粘贴:深度解析CW32固件库结构,让你的MDK工程更清晰 当你从官网下载CW32固件库压缩包并解压后,面对cw32f030-stdperiph-lib目录下密密麻麻的文件夹,是否感到无从下手?很多开发者习惯直接修改官方例程来开发…...

病理图像分析避坑指南:OpenSlide vs pyvips,选哪个?实测性能对比与场景选择

病理图像分析工具选型实战:OpenSlide与pyvips深度性能评测 在数字病理学领域,全切片图像(Whole Slide Image, WSI)的处理一直是技术挑战的核心。面对动辄数GB的高分辨率病理图像,工具链的选择直接决定了分析流程的效率和稳定性。本文将基于实…...

DeepSeek高并发场景下的云原生弹性架构设计(千万QPS容灾实测数据首次公开)

更多请点击: https://codechina.net 第一章:DeepSeek高并发场景下的云原生弹性架构设计(千万QPS容灾实测数据首次公开) 在支撑DeepSeek大模型推理服务的生产环境中,我们构建了一套面向千万级QPS的云原生弹性架构。该架…...

不只是打驱动:深入解读Intel Arc显卡在Linux下的RBAR技术及其对AI性能的实际影响

深入解析Intel Arc显卡RBAR技术:Linux环境下的AI性能优化实践 当一块Intel Arc显卡插入Linux工作站时,大多数用户的第一反应是寻找驱动安装指南。但真正影响AI推理性能的关键,往往隐藏在PCIe总线的一个名为RBAR(Resizable Base Ad…...

【Perplexity反义词权威解析】:20年NLP专家亲授3大语义逆向推导法,97.3%准确率实测验证

更多请点击: https://intelliparadigm.com 第一章:Perplexity反义词查询 在自然语言处理(NLP)领域,Perplexity(困惑度)是衡量语言模型预测能力的核心指标——值越低,表示模型对测试…...

QT开发避坑:为什么你的QWidget死活收不到mouseMoveEvent?从setMouseTracking到子控件拦截的完整排查指南

QT开发避坑指南:QWidget鼠标移动事件失效的深度排查 最近在重构一个QT项目时,我遇到了一个看似简单却令人抓狂的问题——明明已经调用了setMouseTracking(true),但mouseMoveEvent就是死活不触发。经过两天的调试和源码追踪,终于梳…...

保姆级教程:用HWSD世界土壤数据库为SWAT模型快速搭建土壤库(附SPAW软件计算避坑指南)

从HWSD到SWAT:零基础构建高精度土壤数据库的完整指南 水文模型研究者常面临一个棘手问题:如何将全球土壤数据转化为模型可用的参数?HWSD(Harmonized World Soil Database)作为国际权威土壤数据库,与SWAT模…...

使用 TaoToken CLI 工具一键配置多开发环境的大模型端点

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用 TaoToken CLI 工具一键配置多开发环境的大模型端点 在团队协作或跨项目开发中,为不同的 AI 工具(如 C…...

焊接型球头杆端关节轴承鱼眼接头缺陷检测数据集VOC+YOLO格式3205张4类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):3205标注数量(xml文件个数):3205标注数量(txt文件个数):3205标注类别…...

RoboMaster电调通信协议逆向解析:如何用逻辑分析仪抓包调试CAN总线数据

RoboMaster电调通信协议逆向解析:如何用逻辑分析仪抓包调试CAN总线数据 当电机突然停止响应,或是反馈数据出现异常时,大多数开发者会陷入反复检查代码的循环。但真正的解决方案往往隐藏在那些肉眼不可见的CAN总线数据流中。本文将带你用逻辑…...

稀疏记忆微调:面向边缘设备的持续学习落地方法

1. 项目概述:这不是又一篇“加个正则就叫持续学习”的水文“Continual Learning via Sparse Memory Finetuning”——光看标题,你可能以为这是某篇顶会里被塞进附录、连作者自己都懒得细讲的补充实验。但实际翻开原文,它像一把薄刃手术刀&…...

压路机远程监控运维管理平台方案

某压路机设备制造商发现传统的“卖设备售后维修”模式已难以为继。其售出的设备遍布各地工地,由于缺乏远程数据交互手段,制造商总部如同“盲人摸象”:既无法实时掌握设备在工地的具体位置和作业状态,也难以在设备出现电气故障或PL…...