DOM文档对象模型|JS操作页面交互核心API

一、DOM基础概念与DOM树

浏览器解析HTML文档,会把整个页面转化为一棵DOM树。页面中标签、文本、注释全部转换为树上的节点对象,JS通过API访问、修改这些节点。

  • document:文档根节点,DOM的入口对象

  • 元素节点:html、body、div、p、span等标签

  • 文本节点:标签内部的文字内容

  • 属性节点:标签上的id、class、src、data‑*等属性

⚠️ JS代码执行时机:HTML还没解析完成就获取元素,会得到 null。


二、获取DOM元素

操作页面第一步:选中页面目标元素,常用几套API。

复制代码

// 根据id获取,返回单个元素对象 let box = document.getElementById("box"); // CSS选择器获取匹配第一个元素,开发最常用 let item = document.querySelector(".list-item"); // CSS选择器获取全部匹配元素,返回NodeList集合 let listArr = document.querySelectorAll(".list-item"); // 根据类名获取,返回HTMLCollection集合 let clsBox = document.getElementsByClassName("box");

注意:querySelectorAll 返回节点集合,不能直接调用元素方法,必须循环遍历取出每一项。


三、读取修改元素内容

复制代码

let box = document.querySelector(".box"); // innerText:读写纯文本,不会解析HTML标签 box.innerText = "普通文本内容"; // innerHTML:读写内容,可以解析HTML标签 box.innerHTML = "<span style='color:red'>红色文字</span>";

  • innerText:只处理文本,自动忽略标签,安全性高

  • innerHTML:支持渲染标签,存在XSS注入风险,用户输入内容禁止直接赋值


四、元素属性操作

原生标签属性

复制代码

let img = document.querySelector("img"); // 读取属性 console.log(img.src); // 修改属性 img.src = "demo.png"; img.alt = "示例图片";

data‑* 自定义属性(存储业务数据)

复制代码

<div data‑id="1001" data‑title="测试标题"></div>

复制代码

let div = document.querySelector("div"); console.log(div.dataset.id); console.log(div.dataset.title);


五、样式与类名操作

方式一:直接操作行内style,CSS属性转为驼峰命名

复制代码

let box = document.querySelector(".box"); box.style.width = "200px"; box.style.backgroundColor = "#409eff";

方式二:classList 操作类名(工程开发首选)

复制代码

let box = document.querySelector(".box"); box.classList.add("active"); // 添加类 box.classList.remove("active"); // 删除类 box.classList.toggle("active"); // 切换类,有则删、无则加 box.classList.contains("active"); // 判断是否拥有该类,返回布尔值


六、节点创建、追加、删除

复制代码

// 创建新元素节点 let newDiv = document.createElement("div"); newDiv.innerText = "动态创建的元素"; // 获取父容器 let wrap = document.querySelector(".wrap"); // 末尾追加子节点 wrap.appendChild(newDiv); // 删除子节点(父调用) wrap.removeChild(newDiv); // 元素自身删除 newDiv.remove();


七、DOM事件基础

事件:监听用户行为(点击、移入、输入、滚动等),行为触发执行JS逻辑。addEventListener标准绑定方式。

复制代码

let btn = document.querySelector("button"); btn.addEventListener("click", function (e) { console.log("按钮被点击"); // e 事件对象,保存本次事件全部信息 });

高频常用事件:

  • click:鼠标单击

  • mouseenter / mouseleave:鼠标移入移出

  • input:表单输入实时触发

  • scroll:页面滚动事件

事件对象与事件冒泡

事件会从触发的子节点向上传递到父节点、祖先节点,称为事件冒泡。可以调用方法阻止冒泡传递。

复制代码

btn.addEventListener("click", function (e) { e.stopPropagation(); // 阻止事件冒泡 });


八、DOM开发注意要点

  • JS写在HTML前面时,使用DOMContentLoaded等待页面解析完成
复制代码

document.addEventListener("DOMContentLoaded", function () { // 此处执行获取元素DOM操作 });

  • DOM操作性能开销大于普通JS逻辑,减少频繁循环DOM修改

  • 优先classList切换类,少大量直接操作style行内样式

  • innerHTML谨慎使用,防止XSS脚本注入安全问题

相关推荐
害人终害己6 小时前
‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
前端·javascript·vue.js
被摘下的星星6 小时前
CSS 基础说明
前端·css
To_OC16 小时前
从一头雾水到跑通全流程:我用一个周末啃透了JWT登录鉴权
前端·后端·http
excel17 小时前
研究 Vue 3 源码的收获
前端·vue.js
可乐鸡翅yeah_19 小时前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
lerhxx19 小时前
AI 应用如何高效优雅地恢复中断?—— "连接解耦 + 状态持久化"
前端·javascript
计算机魔术师19 小时前
METR 演示 AI 智能体如何篡改 Inspect 评估记录以掩盖不当行为
前端
前端snow20 小时前
ai agent --- 异步处理之 Rabbit MQ
前端
念何架构之路20 小时前
zap扩展生态与总结
java·前端·数据库
独孤九剑打醒他20 小时前
【原创开源】【概念设计】源 - 栅 - 漏 - 栅 - 源 横向双栅 MOS,低压交流多值逻辑芯片探索
前端·其他·架构·开源·硬件工程