JS querySelector方法的优点
1. 灵活性
支持所有 CSS 选择器
- ID 选择器:
#id
- 示例:
document.querySelector('#myId')
- 解释:选择
id
为myId
的元素。
- 示例:
- 类选择器:
.class
- 示例:
document.querySelector('.myClass')
- 解释:选择具有
class
为myClass
的元素。
- 示例:
- 标签选择器:
tag
- 示例:
document.querySelector('div')
- 解释:选择所有
<div>
元素。
- 示例:
- 属性选择器:
[attribute]
- 示例:
document.querySelector('[href="https://example.com"]')
- 解释:选择具有
href
属性值为https://example.com
的元素。
- 示例:
- 组合选择器:
.class1 .class2
,.class1 > .class2
- 示例:
document.querySelector('.container > .item')
- 解释:选择
.container
元素内部的所有直接子元素.item
。
- 示例:
- 伪类选择器:
:hover
,:first-child
- 示例:
document.querySelector('a:hover')
- 解释:选择当前处于悬停状态的
<a>
元素。
- 示例:
- 伪元素选择器:
::before
,::after
- 示例:
document.querySelector('p::before')
- 解释:选择
<p>
元素的::before
伪元素(通常用于样式,而不是脚本操作)。
- 示例:
组合选择器的灵活性
querySelector
支持复杂的组合选择器,这使得你可以精确地选择特定的元素。- 示例:
document.querySelector('.container .item:nth-child(2)')
- 解释:选择
.container
内部的第二个.item
元素。
- 示例:
2. 简洁性
单一方法
- 使用
querySelector
可以替代多个方法(如getElementById
、getElementsByClassName
、getElementsByTagName
等),使代码更加简洁。- 示例:
// 使用 querySelector let elementById = document.querySelector('#myId'); let elementByClass = document.querySelector('.myClass'); let elementByTag = document.querySelector('div');// 对比使用多个方法 let elementById = document.getElementById('myId'); let elementByClass = document.getElementsByClassName('myClass')[0]; let elementByTag = document.getElementsByTagName('div')[0];
- 示例:
代码简洁
querySelector
的语法简洁明了,易于阅读和理解。- 示例:
// 使用 querySelector let firstItem = document.querySelector('.list .item:first-child');// 对比使用多个方法 let listItems = document.getElementsByClassName('list')[0].getElementsByClassName('item'); let firstItem = listItems[0];
- 示例:
3. 链式调用
子树查询
- 可以在一个特定的元素内部使用
querySelector
,从而限制搜索范围,提高性能。- 示例:
let container = document.getElementById('container'); let item = container.querySelector('.item');
- 解释:在
container
元素内部查找具有class
为item
的第一个元素。
- 示例:
4. 动态选择
实时更新
querySelector
每次调用时都会重新解析选择器并查找匹配的元素,即使 DOM 发生了变化,也能正确返回最新的匹配元素。- 示例:
let container = document.getElementById('container'); let item = container.querySelector('.item'); console.log(item); // 输出初始匹配的 .item 元素// 动态添加新的 .item 元素 let newItem = document.createElement('div'); newItem.className = 'item'; container.appendChild(newItem);// 再次查询 let newItemElement = container.querySelector('.item'); console.log(newItemElement); // 输出新添加的 .item 元素
- 示例:
5. 兼容性
广泛支持
- 被所有现代浏览器支持,包括 IE8+。
- 在 IE8 中,只支持基本的选择器(如 ID 选择器、类选择器和标签选择器),不支持伪类和伪元素选择器。
- 示例:
// 在 IE8+ 中支持 let elementById = document.querySelector('#myId'); let elementByClass = document.querySelector('.myClass'); let elementByTag = document.querySelector('div');// 在 IE8 中不支持 let elementByPseudoClass = document.querySelector('a:hover'); // 不支持
6. 性能优化
缓存机制
- 现代浏览器通常会有优化机制,如缓存解析结果,以提高多次调用的性能。
- 示例:
function updateElement() {let element = document.querySelector('.item');element.textContent = 'Updated Text'; }// 多次调用 updateElement for (let i = 0; i < 100; i++) {updateElement(); }
- 示例:
局部搜索
- 通过在特定元素上调用
querySelector
来限制搜索范围,从而提高性能。- 示例:
let container = document.getElementById('container'); let item = container.querySelector('.item'); // 仅在 container 内部搜索
- 示例:
7. 易于扩展
组合使用
- 可以与其他 DOM 操作方法结合使用,构建更复杂的逻辑。
- 示例:
let elements = document.querySelectorAll('.item'); elements.forEach(function(element) {element.style.color = 'blue'; // 修改每个元素的样式 });// 使用箭头函数简化 document.querySelectorAll('.item').forEach(element => {element.style.color = 'blue'; });
- 示例:
8. 避免命名冲突
唯一性要求低
- 不像
getElementById
那样要求id
必须唯一,querySelector
可以使用更宽松的选择器来选择元素,避免因id
冲突而导致的问题。- 示例:
let elements = document.querySelectorAll('.myClass'); if (elements.length > 0) {console.log('Found', elements.length, 'elements with class "myClass"'); }
- 示例:
实际应用场景
1. 表单验证
- 使用
querySelector
可以轻松选择表单中的特定输入字段并进行验证。- 示例:
<form id="myForm"><input type="text" name="username" class="input-field" required><input type="password" name="password" class="input-field" required><button type="submit">Submit</button> </form><script>document.getElementById('myForm').addEventListener('submit', function(event) {event.preventDefault();let username = document.querySelector('[name="username"]');let password = document.querySelector('[name="password"]');if (!username.value || !password.value) {alert('Please fill in all fields.');return;}console.log('Form submitted successfully!');}); </script>
- 示例:
2. 动态内容生成
- 使用
querySelector
可以在动态生成的内容中选择特定的元素。- 示例:
<div id="container"></div><script>function addItem(name, price) {let item = document.createElement('div');item.className = 'item';item.innerHTML = `<span class="name">${name}</span> - <span class="price">${price}</span>`;document.getElementById('container').appendChild(item);}addItem('Apple', '$1.00');addItem('Banana', '$0.50');// 选择第一个商品的价格let firstPrice = document.querySelector('.item .price');console.log(firstPrice.textContent); // 输出 "$1.00" </script>
- 示例:
3. 响应式设计
- 使用
querySelector
可以根据屏幕尺寸选择特定的元素并进行样式调整。- 示例:
<div class="content"><p class="header">Welcome to Our Website</p><p class="body">This is a sample content.</p> </div><script>window.addEventListener('resize', function() {let header = document.querySelector('.content .header');let body = document.querySelector('.content .body');if (window.innerWidth < 600) {header.style.fontSize = '20px';body.style.fontSize = '14px';} else {header.style.fontSize = '24px';body.style.fontSize = '16px';}}); </script>
- 示例:
总结
querySelector
的主要优点在于其灵活性、简洁性、链式调用能力、动态选择特性、广泛的支持和性能优化。这些优点使其成为现代前端开发中选择 DOM 元素的首选方法之一。无论是在简单的项目中还是在复杂的 Web 应用中,querySelector
都能提供强大的功能和高效的性能。
相关文章:
JS querySelector方法的优点
1. 灵活性 支持所有 CSS 选择器 ID 选择器:#id 示例:document.querySelector(#myId)解释:选择 id 为 myId 的元素。类选择器:.class 示例:document.querySelector(.myClass)解释:选择具有 class 为 myCla…...

利用获取商品详情API:item_get可以获取到淘宝商品详情的哪些数据?
先来看下测试的返回数据吧 items: { total_results: 76, totalpage: 8, page_size: 10, page: "1", item: [ { rate_content: "和我家的鞋柜特别搭,加上这一条遮挡布,感觉整洁多了,布料不是硬邦邦的那种,很满意。…...
【大数据学习 | 面经】Spark 3.x 中的AQE(自适应查询执行)
Spark 3.x 中的自适应查询执行(Adaptive Query Execution,简称 AQE)通过多种方式提升性能,主要包括以下几个方面: 动态合并 Shuffle 分区(Coalescing Post Shuffle Partitions): 当 …...
[Vue]Vue-router
路由 对前端路由的理解 在前端技术早期,一个 url 对应一个页面,如果要从 A 页面切换到 B 页面,那么必然伴随着页面的刷新。这个体验并不好,不过在最初也是无奈之举——用户只有在刷新页面的情况下,才可以重新去请求数…...

【HarmonyOS】鸿蒙应用使用lottie动画
【HarmonyOS】鸿蒙应用使用lottie动画 一、lottie动画是什么? https://airbnb.design/lottie Lottie是由Airbnb团队开发的一个适用于iOS、Android、React Native、Web和Windows的开源动画库,用于解析使用Bodymovin导出为JSON的Adobe After Effects动…...

1.使用docker 部署redis Cluster模式 集群3主3从
1.使用docker 部署redis Cluster模式 集群3主3从 1.1 先安装docker 启动docker服务,拉取redis镜像 3主3从我们要在docker启动6个容器docker run --name redis-node-1 --net host --privilegedtrue -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-…...

vue基础之8:computed对比watch
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...

Luban数据插件的用法
配置后数据后,点击图1中的gen.bat文件启动生成配置数据和解析配置数据代码的程序,自动生成配置数据和解析用到的代码;因为我已经 指定了生成内容的输出路径为Unity项目的路径下面,所以,不用再搬运生成的内容到项目目录…...

指针(上)
目录 内存和地址 指针变量和地址 取地址(&) 解引用(*) 大小 类型 意义 const修饰 修饰变量 修饰指针 指针运算 指针- 整数 指针-指针 指针的关系运算 野指针 概念 成因 避免 assert断言 指针的使用 strl…...

张伟楠动手学强化学习笔记|第一讲(上)
张伟楠动手学强化学习笔记|第一讲(上) 人工智能的两种任务类型 预测型任务 有监督学习无监督学习 决策型任务 强化学习 序贯决策(Sequential Decision Making) 智能体序贯地做出一个个决策,并接续看到新的观测,知道最终任务结…...
python脚本:Word文档批量转PDF格式
读取指定文件夹中的所有 .doc 和 .docx 文件,并利用 Word 软件将它们转换为 PDF 格式,并保存在同一个文件夹中,以源文件命名。 请确保你已经安装了 Microsoft Word,并且在运行脚本时关闭了所有正在运行的 Word 实例。运行该程序时…...

性能测试常见面试问题和答案
一、有没有做过性能测试,具体怎么做的 性能测试是有做过的,不过我们那个项目的性能做得不多,公司要求也不严格。一般SE 给我们相关的性能需求,首先我们需要对性能需求进行场景分析与设计,这里,其实主要就是…...

uniapp进阶技巧:如何优雅地封装request实例
在uniapp开发过程中,合理封装网络请求是提高代码质量和开发效率的关键。本文将介绍一种更为优雅的封装方式,通过创建一个request实例来管理不同类型的HTTP请求。 一、准备工作 在开始封装之前,请确保你的项目中已经安装了uniapp开发环境&…...

实验五、流式视频服务程序mjpg-streamer移植实验
实验日期: 2024 年 10 月 22 日 报告退发 (订正 、 重做) 一、实验目的 1、掌握流式视频服务程序源代码mjpg-streamer的交叉编译方法; 2、掌握在tiny210开发板中运行mjpg-streamer方法; 二、实验内容 1、开启一台烧写了嵌入式Linux系统的…...

(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验三----学校选址与路径规划(超超超详细!!!)
目录 实验三 学校选址与道路规划 3.1 实验内容及目的 3.1.1 实验内容 3.1.2 实验目的 3.2 实验方案 3.3 操作流程 3.3.1 环境设置 3.3.2 地势分析 (1)提取坡度: (2)重分类: 3.3.3 学校点分析 (1)欧氏距离: (2)重分类: 3.3.4 娱乐场所点分析 (1)欧氏距离…...

L16.【LeetCode笔记】前序遍历
目录 1.知识回顾 2.题目 代码模板 3.分析 数组的初始化 malloc开辟的几种方案对比 奇怪的参数returnSize 做法 代码框架 4.代码 提交结果 5.PreOrder函数常见的错误写法 1.知识回顾 106.【C语言】数据结构之二叉树的三种递归遍历方式 2.题目 https://leetcode.…...

泰州榉之乡全托机构探讨:自闭症并非家庭的 “末日”
当提及自闭症时,很多人会担忧地问:自闭症对家庭来说是毁灭性的吗?今天,泰州榉之乡全托机构就来为大家解开这个疑问。 榉之乡大龄自闭症托养机构在江苏、广东、江西等地都有分校,一直致力于为大龄自闭症患者提供专业的支…...

BiGRU:双向门控循环单元在序列处理中的深度探索
一、引言 在当今的人工智能领域,序列数据的处理是一个极为重要的任务,涵盖了自然语言处理、语音识别、时间序列分析等多个关键领域。循环神经网络(RNN)及其衍生结构在处理序列数据方面发挥了重要作用。然而,传统的 RN…...

【vue-router】Vue-router如何实现路由懒加载
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

Linux网络编程基础
目录 一、网络发展历史和分层 1.1Internet的历史 1.2网络的体系结构 1.2.1OSI模型 1.2.2TCP/IP协议族 1.2.3各层典型协议 1.2.4网络的封包和拆包 二、网络编程的预备知识 2.1Socket 2.1.1概念 2.1.2类型 2.2IP地址 2.3端口号 2.4字节序 一、网络发展历史和分层 …...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...