你知道的和你不知道的DOM操作技巧

你知道的和你不知道的DOM操作技巧

亲爱的前端小伙伴们,今天我们来聊聊那些你可能知道或者不知道的DOM操作技巧。作为一名前端开发者,如果你还在为DOM操作头疼,那么这篇文章绝对能让你茅塞顿开。让我们一起来探索一下DOM的奥秘吧!

1. 选择元素的新姿势

还在用document.getElementById()document.getElementsByClassName()吗?那你就太out了!现代浏览器早就支持querySelectorquerySelectorAll这两个强大的方法了。

// 老派写法
const oldSchool = document.getElementById('myElement');// 新潮写法
const newCool = document.querySelector('#myElement');// 选择多个元素
const elements = document.querySelectorAll('.myClass');

这两个方法不仅语法简洁,而且支持复杂的CSS选择器。你甚至可以这样玩:

// 选择所有带有data-awesome属性的div元素中的第一个p元素
const awesomeP = document.querySelector('div[data-awesome] p:first-child');

2. 创建元素的小技巧

创建元素时,不要只盯着document.createElement()看。来看看这个黑魔法:

const div = document.createElement('div');
div.innerHTML = '<p>Hello</p><span>World</span>';// 等效于
const template = document.createElement('template');
template.innerHTML = '<div><p>Hello</p><span>World</span></div>';
const div = template.content.firstElementChild;

使用template元素可以一次性创建复杂的DOM结构,而且性能更好。这简直是懒人福音啊!

3. 事件委托,你真的会用吗?

事件委托是一种常见的优化技巧,但很多人可能只是知道个皮毛。让我们来深入探讨一下:

document.getElementById('parent').addEventListener('click', function(e) {if (e.target.matches('.child')) {console.log('Child clicked!');}
});

这段代码看起来没问题,但如果.child元素内部还有其他元素呢?e.target可能就不是.child了。来看看改进版:

document.getElementById('parent').addEventListener('click', function(e) {const child = e.target.closest('.child');if (child && this.contains(child)) {console.log('Child or its descendant clicked!');}
});

使用closest()方法可以找到最近的匹配元素,contains()则确保找到的元素确实在监听器所在的元素内部。这样就万无一失了!

4. DOM操作的性能优化

DOM操作是昂贵的,特别是当你需要频繁更新DOM时。这里有几个小技巧可以帮你提升性能:

4.1 使用文档片段

const fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {const el = document.createElement('div');el.textContent = `Item ${i}`;fragment.appendChild(el);
}
document.body.appendChild(fragment);

使用DocumentFragment可以在内存中操作DOM,最后一次性添加到文档中,大大减少了页面重绘的次数。

4.2 批量更新样式

// 糟糕的写法
const el = document.getElementById('myElement');
el.style.width = '100px';
el.style.height = '100px';
el.style.backgroundColor = 'red';// 优秀的写法
const el = document.getElementById('myElement');
el.classList.add('my-class');// CSS
.my-class {width: 100px;height: 100px;background-color: red;
}

通过添加类名一次性应用多个样式,可以减少浏览器的重排和重绘。

5. 你不知道的DOM API

现代浏览器提供了许多强大但鲜为人知的DOM API,让我们来看几个有趣的:

5.1 IntersectionObserver

想知道元素是否进入视口吗?不需要再监听滚动事件了,IntersectionObserver来帮你:

const observer = new IntersectionObserver((entries) => {entries.forEach(entry => {if (entry.isIntersecting) {console.log('Element is visible!');}});
});observer.observe(document.querySelector('#myElement'));

这个API不仅可以用来实现懒加载,还能做出各种炫酷的滚动效果。

5.2 MutationObserver

想监听DOM变化吗?MutationObserver就是为此而生的:

const observer = new MutationObserver((mutations) => {mutations.forEach(mutation => {console.log('DOM changed!');});
});observer.observe(document.body, {childList: true,subtree: true
});

这个API可以帮你监控DOM的变化,对于需要响应DOM动态变化的场景非常有用。

5.3 ResizeObserver

元素大小变化也能监听?没错,ResizeObserver就是干这个的:

const observer = new ResizeObserver(entries => {entries.forEach(entry => {console.log('Element size changed!');});
});observer.observe(document.querySelector('#myElement'));

再也不用担心元素大小变化带来的布局问题了!

总结

DOM操作虽然看似简单,但要真正玩转它还是需要不少技巧的。从选择元素到创建元素,从事件处理到性能优化,再到一些新奇的API,每一个方面都值得我们深入研究。

记住,DOM操作就像是魔法,用得好可以让你的网页如丝般顺滑,用得不好可能就会变成一团浆糊。所以,善用这些技巧,让你的DOM操作既优雅又高效吧!

最后,如果你觉得自己已经掌握了这些技巧,那么恭喜你,你已经从DOM操作的"小白"晋升为"小灰"了。但是,技术的世界永无止境,保持学习的热情,也许明天你就能成为DOM操作的"大师"呢!

好了,今天的DOM操作技巧分享就到这里。如果你有什么独特的DOM操作技巧,不妨在评论区分享一下。我们下期再见,拜拜!

海码面试 小程序

包含最新面试经验分享,面试真题解析,全栈2000+题目库,前后端面试技术手册详解;无论您是校招还是社招面试还是想提升编程能力,都能从容面对~

分享就到这里。如果你有什么独特的DOM操作技巧,不妨在评论区分享一下。我们下期再见,拜拜!

海码面试 小程序

包含最新面试经验分享,面试真题解析,全栈2000+题目库,前后端面试技术手册详解;无论您是校招还是社招面试还是想提升编程能力,都能从容面对~

[外链图片转存中…(img-3lF3vlXy-1720602643960)]

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

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

相关文章

2024春秋杯网络安全联赛夏季赛-PWN

文章目录 stdout测试setvbuf(stdout, 0LL, 2, 0LL)绕过或者输出直到缓冲区满使用system("/bin/sh")或者onegadget即使setvbuf(stdout, 0LL, 0, 0LL);也能立即有回显参考[https://starrysky1004.github.io/2024/07/05/2024-shu-qi-xue-xi-ji-lu/#toc-heading-4](https…

搜维尔科技:【研究】Scalefit是一款可在工作场所自动处理3D姿势分析结果的软件

Scalefit是一款可在工作场所自动处理 3D 姿势分析结果的软件。这甚至可以在衡量员工的同时发生。然后&#xff0c;Scalefit 根据国际标准对姿势、压缩力和关节力矩进行分析和可视化。 3D姿势分析 如今&#xff0c;Xsens 技术可让您快速测量工作场所员工的态度。一套带有 17 个…

开源无人机从入门到炸机,共需要几步?

阿木实验室2024年的重磅新品 Prometheus 仿真笔记本已经上架有一段时间了&#xff0c;近日&#xff0c;该产品的研发负责人廖工受邀到直播间与开发者们深度解读了Prometheus仿真笔记本的设计理念。直播过程中&#xff0c;廖工不仅展示了该产品的功能demo&#xff0c;解答技术开…

Postman API性能测试:解锁高级技巧的宝库

&#x1f680; Postman API性能测试&#xff1a;解锁高级技巧的宝库 在API开发和测试过程中&#xff0c;性能测试是确保API稳定性和可靠性的关键环节。Postman作为API测试的强大工具&#xff0c;提供了多种性能测试功能和高级技巧&#xff0c;帮助开发者深入分析API的性能表现…

掌握Conda配置术:conda config命令的深度指南

掌握Conda配置术&#xff1a;conda config命令的深度指南 引言 Conda是一个功能强大的包管理器和环境管理器&#xff0c;广泛用于Python和其他科学计算语言的依赖管理。conda config命令是Conda套件中用于配置和自定义Conda行为的关键工具。通过这个命令&#xff0c;用户可以…

leetcode:1332. 删除回文子序列(python3解法)

难度&#xff1a;简单 给你一个字符串 s&#xff0c;它仅由字母 a 和 b 组成。每一次删除操作都可以从 s 中删除一个回文 子序列。 返回删除给定字符串中所有字符&#xff08;字符串为空&#xff09;的最小删除次数。 「子序列」定义&#xff1a;如果一个字符串可以通过删除原字…

less和sass有啥区别哪个更加好

Less 和 Sass&#xff08;特别是其最流行的变体 SCSS&#xff09;都是 CSS 预处理器&#xff0c;它们扩展了 CSS 的功能&#xff0c;如变量、嵌套规则、混合&#xff08;Mixins&#xff09;、函数等&#xff0c;以编程方式生成 CSS。它们之间的主要区别在于语法、功能和工具生态…

本地部署,图片细节处理大模型Tile Controlnet

目录 什么是 Tile ControlNet&#xff1f; 工作原理 应用场景 优势与挑战 优势 挑战 本地部署 运行结果 未来展望 结论 Tip&#xff1a; 在近年来的深度学习和计算机视觉领域&#xff0c;生成对抗网络&#xff08;GAN&#xff09;和扩散模型等技术取得了显著的进展。…

理解和解决Spring框架中的事务自调用问题

在使用Spring框架进行企业级应用开发时&#xff0c;事务管理是保证数据一致性和系统稳定性的关键技术。Spring提供的Transactional注解允许开发者轻松声明方法的事务行为&#xff0c;但不正确的使用可能导致事务不被正确触发&#xff0c;尤其是在方法自调用的场景中。本文将深入…

NAND Flash 常用命令

NAND Flash 常用命令 NAND Flash 常用命令主要包括以下几类&#xff1a;重置命令、读取信息命令、状态命令、页面读取命令、页面编程命令、拷贝命令、擦除命令。具体命令如下&#xff1a; 重置命令&#xff1a; ResetSynchronous ResetReset LUNHard Reset 读取信息命令&am…

技术文件国产化准备

技术文档的本地化涉及调整内容以满足特定目标市场的文化、语言和技术要求。这一过程超越了简单的翻译&#xff0c;确保文件在文化上适合预期受众&#xff0c;在技术上准确无误。适当的准备对于成功的本地化至关重要&#xff0c;以下步骤概述了一种全面的方法。 分析目标受众 …

Elasticsearch7.5.2 常用rest api与elasticsearch库

目录 一、rest api 1. 新建索引 2. 删除索引 3. 插入单条数据 4. 更新单条数据 5. 删除单条数据 6. 查询数据 二、python elasticsearch库 1. 新建索引 一、rest api 1. 新建索引 请求方式&#xff1a;PUT 请求URL&#xff1a;http://ip/&#xff08;your_index_nam…

二十四、常用API之Object

前面学习的Java的语法基础&#xff0c; 后面的几篇介绍一下Java的常用API 那么什么是API&#xff1f;&#xff08;Application Programming Interface,应用程序编程接口&#xff09; API就是一组用于构建和集成应用软件的定义和协议。 学习类的过程就是学习Java的过程&#xff…

JAVA实现智能问答助手-GPT4o+向量数据库+FunctionCalling

本文基于上一篇文章GPT向量数据库Function calling垂直领域小助手进行了改进&#xff0c;对其中的循环请求GPT、FuctionCalling循环请求、MSGList缩容等进行了修改和优化&#xff0c;使的相关请求更加抽象和方便后续做延伸。文章中涉及业务属性的内容已经进行了过滤&#xff0c…

在Visutal Studio 2022中完成D3D12初始化

在Visutal Studio 2022中完成DirectX设备初始化 1 DirectX121.1 DirectX 简介1.2 DirectX SDK安装2 D3D12初始化2.1 创建Windwos桌面项目2.2 修改符合模式2.3 下载d3dx12.h文件2.4 创建一个异常类D3DException,定义抛出异常实例的宏ThrowIfFailed3 D3D12的初始化步骤3.1 初始化…

pytorch实现水果2分类(蓝莓,苹果)

1.数据集的路径&#xff0c;结构 dataset.py 目的&#xff1a; 输入&#xff1a;没有输入&#xff0c;路径是写死了的。 输出&#xff1a;返回的是一个对象&#xff0c;里面有self.data。self.data是一个列表&#xff0c;里面是&#xff08;图片路径.jpg&#xff0c;标签&…

JMH325【剑侠情缘3】第2版80级橙武网游单机更稳定亲测视频安装教学更新整合收集各类修改教学补丁兴趣可以慢慢探索

资源介绍&#xff1a; 是否需要虚拟机&#xff1a;是 文件大小&#xff1a;压缩包约14G 支持系统&#xff1a;win10、win11 硬件需求&#xff1a;运行内存8G 4核及以上CPU独立显卡 下载方式&#xff1a;百度网盘 任务修复&#xff1a; 1&#xff0c;掌门任务&#xff08…

【Android组件】封装加载弹框

&#x1f4d6;封装加载弹框 ✅1. 构造LoadingDialog✅2. 调用LoadingDialog 效果&#xff1a; ✅1. 构造LoadingDialog 构造LoadingDialog类涉及到设计模式中的建造者模式&#xff0c;进行链式调用&#xff0c;注重的是构建的过程&#xff0c;设置需要的属性。 步骤一&#x…

[数据结构] 归并排序快速排序 及非递归实现

&#xff08;&#xff09;标题&#xff1a;[数据结构] 归并排序&&快速排序 及非递归实现 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 (一)快速排序 类比递归谋划非递归 快速排序的非递归实现&#xff1a; &#xff08;二&#xff09;归并排序 归…

Elasticsearch文档_id以数组方式返回

背景需求是只需要文档的_id字段&#xff0c;并且_id组装成一个数组。 在搜索请求中使用 script_fields 来整理 _id 为数组输出&#xff1a; POST goods_info/_search?size0 {"query": {"term": {"brand": {"value": "MGC"…