news 2026/1/18 1:07:26

玩转DOM:像玩乐高一样操作网页元素

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
玩转DOM:像玩乐高一样操作网页元素

你以为前端只是写写样式?DOM操作才是让网页“活”起来的魔法!

🎯 什么是DOM?

想象一下,你在玩乐高积木。每个积木块就像网页上的一个元素(按钮、图片、文字等),而**DOM(文档对象模型)**就是这份乐高搭建说明书,告诉浏览器如何组织这些积木。

// 简单说:DOM是HTML的编程接口// HTML是静态的代码,DOM是动态的对象树

🌳 DOM树:网页的家族图谱

每个网页都是一棵倒置的“家族树”:

  • <html>是爷爷
  • <body>是爸爸
  • <div><p>是孩子们
  • 文本和属性是孙辈们
<!-- 看这个简单的HTML --><html><head><title>我的网站</title></head><body><divid="app"><h1>欢迎!</h1><button>点击我</button></div></body></html>

对应的DOM树是这样的:

Document

html

head

body

title

文本: '我的网站'

div#app

h1

button

文本: '欢迎!'

文本: '点击我'

🛠️ DOM操作四板斧

1️⃣查找元素:找到你要操作的积木

// 方法一:按ID找(最精确)constappDiv=document.getElementById('app');// 方法二:按CSS选择器找(最常用)consttitle=document.querySelector('h1');constbuttons=document.querySelectorAll('button');// 方法三:按类名找constitems=document.getElementsByClassName('item');// 方法四:按标签名找constdivs=document.getElementsByTagName('div');

2️⃣修改内容:给积木换颜色

// 改文本title.textContent='你好,世界!';title.innerHTML='<span>你好</span>,世界!';// 可以包含HTML// 改样式appDiv.style.backgroundColor='skyblue';appDiv.style.fontSize='20px';// 改属性constimg=document.querySelector('img');img.setAttribute('src','new-image.jpg');img.alt='新图片';

3️⃣增删元素:添加或移除积木

// 创建新元素constnewButton=document.createElement('button');newButton.textContent='我是新的!';// 添加到页面appDiv.appendChild(newButton);// 加在最后appDiv.insertBefore(newButton,title);// 插在title前面// 移除元素appDiv.removeChild(title);// 移除标题newButton.remove();// 更简单的方法

4️⃣事件处理:让积木“活”起来

// 添加点击事件newButton.addEventListener('click',function(event){console.log('按钮被点了!');this.style.backgroundColor='red';// 事件冒泡:从内到外传递event.stopPropagation();// 阻止冒泡});// 常见事件类型// click - 点击// mouseenter/mouseleave - 鼠标进出// keydown/keyup - 键盘按下/松开// submit - 表单提交// load - 页面加载完成

🔄 DOM操作完整流程图

开始DOM操作

第一步:查找元素

getElementById
最精确

querySelector
最灵活

其他选择器

第二步:要做什么?

修改内容/样式

添加/删除元素

添加事件监听

更新界面

用户交互

完成!

🚀 实战:创建动态待办清单

让我们用DOM操作做一个简单的待办事项应用:

<!DOCTYPEhtml><html><head><style>.completed{text-decoration:line-through;color:gray;}li{margin:10px 0;cursor:pointer;}</style></head><body><h2>我的待办清单</h2><inputid="todoInput"type="text"placeholder="输入新任务"><buttonid="addBtn">添加</button><ulid="todoList"></ul><script>consttodoInput=document.getElementById('todoInput');constaddBtn=document.getElementById('addBtn');consttodoList=document.getElementById('todoList');// 添加任务addBtn.addEventListener('click',()=>{consttaskText=todoInput.value.trim();if(taskText){addTodoItem(taskText);todoInput.value='';// 清空输入框}});// 按回车也可以添加todoInput.addEventListener('keypress',(e)=>{if(e.key==='Enter')addBtn.click();});functionaddTodoItem(text){// 创建列表项constli=document.createElement('li');li.textContent=text;// 点击标记完成/未完成li.addEventListener('click',function(){this.classList.toggle('completed');});// 添加删除按钮constdeleteBtn=document.createElement('button');deleteBtn.textContent='删除';deleteBtn.style.marginLeft='10px';deleteBtn.addEventListener('click',function(e){e.stopPropagation();// 阻止触发li的点击事件this.parentElement.remove();});li.appendChild(deleteBtn);todoList.appendChild(li);}// 添加示例任务addTodoItem('学习DOM操作');addTodoItem('写博客文章');addTodoItem('喝杯咖啡休息一下');</script></body></html>

💡 性能小贴士

  1. 减少DOM操作次数:多次操作合并成一次

    // 不好:操作了3次DOMelement.style.color='red';element.style.fontSize='20px';element.style.margin='10px';// 好:只操作1次element.style.cssText='color: red; font-size: 20px; margin: 10px;';
  2. 使用文档片段:批量添加元素时

    constfragment=document.createDocumentFragment();for(leti=0;i<100;i++){constli=document.createElement('li');li.textContent=`项目${i}`;fragment.appendChild(li);}list.appendChild(fragment);// 只触发一次重排
  3. 事件委托:减少事件监听器数量

    // 不好:每个按钮都加监听器buttons.forEach(btn=>btn.addEventListener('click',handleClick));// 好:父元素一个监听器搞定container.addEventListener('click',function(e){if(e.target.tagName==='BUTTON'){handleClick(e.target);}});

🎓 总结

DOM操作就像是给网页赋予生命的魔法:

  • 查找是找到正确的积木
  • 修改是调整积木的外观
  • 增删是搭建或拆除结构
  • 事件是让积木能响应用户

记住:DOM操作是昂贵的(性能角度),所以要聪明地使用它。就像真正的乐高大师,知道何时快速搭建,何时精心调整。

现在,去创造属于你的动态网页吧! 🚀


动手挑战:用纯DOM操作创建一个简单的图片轮播组件。提示:你需要createElementappendChildsetAttribute和事件监听器!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/15 17:45:56

SonarQube代码质量:VibeThinker生成自定义规则插件

SonarQube代码质量&#xff1a;VibeThinker生成自定义规则插件 在AI辅助编程日益普及的今天&#xff0c;一个现实问题逐渐浮现&#xff1a;我们能完全信任模型生成的代码吗&#xff1f;尤其是在算法竞赛、数学推导等高逻辑密度场景下&#xff0c;像微博开源的 VibeThinker-1.5B…

作者头像 李华
网站建设 2026/1/13 2:12:49

Travis CI迁移指南:VibeThinker建议转向GitHub Actions

Travis CI迁移指南&#xff1a;VibeThinker建议转向GitHub Actions 在 AI 模型开发日益工程化的今天&#xff0c;一个稳定、高效的自动化流水线不再是“锦上添花”&#xff0c;而是决定项目能否持续迭代的核心基础设施。以轻量级数学推理模型 VibeThinker-1.5B-APP 为例&#x…

作者头像 李华
网站建设 2026/1/10 11:46:54

Git commit信息自动生成:利用VibeThinker提升团队协作效率

Git Commit 信息自动生成&#xff1a;用 VibeThinker 提升团队协作效率 在日常开发中&#xff0c;你是否经历过这样的场景&#xff1f;刚修复完一个棘手的并发问题&#xff0c;急着提交代码上线&#xff0c;随手敲下 git commit -m "fix bug" 就推了上去。几个月后&a…

作者头像 李华
网站建设 2026/1/12 17:58:28

/root目录下找不到脚本文件?正确挂载卷的方法说明

/root 目录下找不到脚本文件&#xff1f;正确挂载卷的方法说明 在部署轻量级大模型时&#xff0c;尤其是像 VibeThinker-1.5B-APP 这类专为数学推理与编程任务优化的本地化镜像&#xff0c;开发者常会遇到一个看似简单却令人困惑的问题&#xff1a;为什么我在容器里 ls /root 什…

作者头像 李华