当前位置: 首页 > news >正文

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 可以替代多个方法(如 getElementByIdgetElementsByClassNamegetElementsByTagName 等),使代码更加简洁。
    • 示例:
      // 使用 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 选择器&#xff1a;#id 示例&#xff1a;document.querySelector(#myId)解释&#xff1a;选择 id 为 myId 的元素。类选择器&#xff1a;.class 示例&#xff1a;document.querySelector(.myClass)解释&#xff1a;选择具有 class 为 myCla…...

利用获取商品详情API:item_get可以获取到淘宝商品详情的哪些数据?

先来看下测试的返回数据吧 items: { total_results: 76, totalpage: 8, page_size: 10, page: "1", item: [ { rate_content: "和我家的鞋柜特别搭&#xff0c;加上这一条遮挡布&#xff0c;感觉整洁多了&#xff0c;布料不是硬邦邦的那种&#xff0c;很满意。…...

【大数据学习 | 面经】Spark 3.x 中的AQE(自适应查询执行)

Spark 3.x 中的自适应查询执行&#xff08;Adaptive Query Execution&#xff0c;简称 AQE&#xff09;通过多种方式提升性能&#xff0c;主要包括以下几个方面&#xff1a; 动态合并 Shuffle 分区&#xff08;Coalescing Post Shuffle Partitions&#xff09;&#xff1a; 当 …...

[Vue]Vue-router

路由 对前端路由的理解 在前端技术早期&#xff0c;一个 url 对应一个页面&#xff0c;如果要从 A 页面切换到 B 页面&#xff0c;那么必然伴随着页面的刷新。这个体验并不好&#xff0c;不过在最初也是无奈之举——用户只有在刷新页面的情况下&#xff0c;才可以重新去请求数…...

【HarmonyOS】鸿蒙应用使用lottie动画

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

1.使用docker 部署redis Cluster模式 集群3主3从

1.使用docker 部署redis Cluster模式 集群3主3从 1.1 先安装docker 启动docker服务&#xff0c;拉取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博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…...

Luban数据插件的用法

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

指针(上)

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

张伟楠动手学强化学习笔记|第一讲(上)

张伟楠动手学强化学习笔记|第一讲&#xff08;上&#xff09; 人工智能的两种任务类型 预测型任务 有监督学习无监督学习 决策型任务 强化学习 序贯决策(Sequential Decision Making) 智能体序贯地做出一个个决策&#xff0c;并接续看到新的观测&#xff0c;知道最终任务结…...

python脚本:Word文档批量转PDF格式

读取指定文件夹中的所有 .doc 和 .docx 文件&#xff0c;并利用 Word 软件将它们转换为 PDF 格式&#xff0c;并保存在同一个文件夹中&#xff0c;以源文件命名。 请确保你已经安装了 Microsoft Word&#xff0c;并且在运行脚本时关闭了所有正在运行的 Word 实例。运行该程序时…...

性能测试常见面试问题和答案

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

uniapp进阶技巧:如何优雅地封装request实例

在uniapp开发过程中&#xff0c;合理封装网络请求是提高代码质量和开发效率的关键。本文将介绍一种更为优雅的封装方式&#xff0c;通过创建一个request实例来管理不同类型的HTTP请求。 一、准备工作 在开始封装之前&#xff0c;请确保你的项目中已经安装了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 地势分析 &#xff08;1&#xff09;提取坡度: (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.…...

泰州榉之乡全托机构探讨:自闭症并非家庭的 “末日”

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

BiGRU:双向门控循环单元在序列处理中的深度探索

一、引言 在当今的人工智能领域&#xff0c;序列数据的处理是一个极为重要的任务&#xff0c;涵盖了自然语言处理、语音识别、时间序列分析等多个关键领域。循环神经网络&#xff08;RNN&#xff09;及其衍生结构在处理序列数据方面发挥了重要作用。然而&#xff0c;传统的 RN…...

【vue-router】Vue-router如何实现路由懒加载

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

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字节序 一、网络发展历史和分层 …...

突破3大资源壁垒:UABEA工具实战指南

突破3大资源壁垒&#xff1a;UABEA工具实战指南 【免费下载链接】UABEA UABEA: 这是一个用于新版本Unity的C# Asset Bundle Extractor&#xff08;资源包提取器&#xff09;&#xff0c;用于提取游戏中的资源。 项目地址: https://gitcode.com/gh_mirrors/ua/UABEA 当你…...

3大突破!开源RGB控制终极指南:从多软件混战到统一灯光管理

3大突破&#xff01;开源RGB控制终极指南&#xff1a;从多软件混战到统一灯光管理 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcProgrammer1/…...

macOS效率工具:Dozer极简菜单栏管理方案

macOS效率工具&#xff1a;Dozer极简菜单栏管理方案 【免费下载链接】Dozer Hide menu bar icons on macOS 项目地址: https://gitcode.com/gh_mirrors/do/Dozer 在现代工作环境中&#xff0c;macOS用户常常面临菜单栏图标过多导致的视觉混乱问题。随着各类应用程序的安…...

企业级图片批量处理方案:InstructPix2Pix在电商修图中的落地实践

企业级图片批量处理方案&#xff1a;InstructPix2Pix在电商修图中的落地实践 1. 引言&#xff1a;电商修图的效率困局 想象一下&#xff0c;一家中型电商公司&#xff0c;每天要上新几百个商品。每个商品都需要一组高质量的主图、细节图、场景图。设计师团队忙得焦头烂额&…...

Z-Image-Turbo_Sugar脸部Lora效果增强:ControlNet+Lora联合调控Sugar脸部结构

Z-Image-Turbo_Sugar脸部Lora效果增强&#xff1a;ControlNetLora联合调控Sugar脸部结构 想生成那种又纯又欲、甜度爆表的Sugar风格脸部图片吗&#xff1f;是不是经常遇到模型生成的脸型不够精致、五官比例失调&#xff0c;或者风格不够统一的问题&#xff1f;今天&#xff0c…...

网络电台个性化高效管理:foobox-cn技术实现与应用指南

网络电台个性化高效管理&#xff1a;foobox-cn技术实现与应用指南 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn foobox-cn作为foobar2000的DUI配置方案&#xff0c;通过创新的电台管理系统架构&…...

Qwen3-ASR-0.6B开发者案例:集成至CRM系统实现通话内容自动归档

Qwen3-ASR-0.6B开发者案例&#xff1a;集成至CRM系统实现通话内容自动归档 1. 项目背景与需求场景 在现代企业客户关系管理&#xff08;CRM&#xff09;系统中&#xff0c;通话录音是宝贵的业务数据资源。销售团队的客户沟通、客服中心的问题解决、业务洽谈的重要细节——所有…...

若依框架下,如何让JimuReport积木报表乖乖认你的登录状态?(附完整前后端代码)

若依框架与JimuReport深度整合&#xff1a;实现无缝登录状态管理的全链路实践 在当今企业级应用开发中&#xff0c;权限控制与单点登录已成为基础需求。当我们将若依(RuoYi)这一流行后台管理系统框架与JimuReport报表工具集成时&#xff0c;如何确保两者间的登录状态无缝衔接&a…...

5分钟上手:在浏览器中创造惊艳的流体艺术特效

5分钟上手&#xff1a;在浏览器中创造惊艳的流体艺术特效 【免费下载链接】WebGL-Fluid-Simulation Play with fluids in your browser (works even on mobile) 项目地址: https://gitcode.com/gh_mirrors/web/WebGL-Fluid-Simulation 想要在浏览器中体验令人惊叹的流体…...

告别混乱标注!手把手教你定制LabelImg的标注框颜色与样式(附打包exe完整流程)

视觉标注效率革命&#xff1a;LabelImg高级定制与团队部署实战指南 在计算机视觉项目的标注环节中&#xff0c;混乱的视觉呈现往往成为效率瓶颈。当标注员面对数百张包含"车辆"、"行人"、"交通标志"等多类别的图像时&#xff0c;系统随机分配的标…...