你知道的和你不知道的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;解答技术开…

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

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

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

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

技术文件国产化准备

技术文档的本地化涉及调整内容以满足特定目标市场的文化、语言和技术要求。这一过程超越了简单的翻译&#xff0c;确保文件在文化上适合预期受众&#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"…

明白这两大关键点,轻松脱单不再是难题!

很多未婚男女都渴望找到心仪的伴侣&#xff0c;建立稳定的情感关系&#xff0c;但往往在脱单的过程中跌跌撞撞。平时与同学、同事之间相处得很融洽&#xff0c;一旦遇到心仪的异性&#xff0c;情商直接掉线&#xff0c;难道情商也会选择性地发挥作用吗&#xff1f;其实&#xf…

什么牌子的开放式耳机好用?南卡、Cleer、小米、开石超值机型力荐!

​开放式耳机在如今社会中已经迅速成为大家购买耳机的新趋势&#xff0c;深受喜欢听歌和热爱运动的人群欢迎。当大家谈到佩戴的稳固性时&#xff0c;开放式耳机都会收到一致好评。对于热爱运动的人士而言&#xff0c;高品质的开放式耳机无疑是理想之选。特别是在近年来的一些骑…

AnimateLCM:高效生成连贯真实的视频

视频扩散模型因其能够生成连贯且高保真的视频而日益受到关注。然而&#xff0c;迭代去噪过程使得这类模型计算密集且耗时&#xff0c;限制了其应用范围。香港中文大学 MMLab、Avolution AI、上海人工智能实验室和商汤科技公司的研究团队提出了AnimateLCM&#xff0c;这是一种允…

电子电气架构 --- 关于DoIP的一些闲思 上

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

JavaDS —— 单链表 与 LinkedList

顺序表和链表区别 ArrayList &#xff1a; 底层使用连续的空间&#xff0c;可以随机访问某下标的元素&#xff0c;时间复杂度为O&#xff08;1&#xff09; 但是在插入和删除操作的时候&#xff0c;需要将该位置的后序元素整体往前或者向后移动&#xff0c;时间复杂度为O&…

什么是智能制造?

科技的每一次飞跃都深刻改变着我们的生产生活方式。其中&#xff0c;智能制造作为工业4.0的核心概念&#xff0c;正引领着全球制造业向更加高效、灵活、智能的方向迈进。那么&#xff0c;究竟什么是智能制造&#xff1f;它如何重塑我们的工业版图&#xff0c;又将对未来社会产生…

TTT架构超越Transformer,ML模型替代RNN隐藏状态!

目录 01 算法原理 02 骨干架构 03 实验结果 一种崭新的大语言模型&#xff08;LLM&#xff09;架构有望取代当前主导 AI 领域的 Transformer&#xff0c;并在性能上超越 Mamba。 论文地址&#xff1a;https://arxiv.org/abs/2407.04620 本周一&#xff0c;关于 Test-Time Tr…

修复 Ubuntu 24.04 Dock 丢失应用程序图标

找出应用程序窗口的类名 首先&#xff0c;您需要启动应用程序窗口。然后&#xff0c;按 Alt F2 启动“运行 Command”对话框。当对话框打开时&#xff0c;输入 lg 并按 Enter 键。 在该窗口中&#xff0c;单击Windows按钮&#xff0c;然后找出目标应用程序窗口的类名称。 在/…