JavaScript 的 `querySelector` 方法详解

querySelector 是 JavaScript 中用于选择 DOM 元素的最强大方法之一,它允许你使用 CSS 选择器语法来查找元素。

基本语法

// 返回文档中第一个匹配指定 CSS 选择器的元素
element = document.querySelector(selectors);// 从指定元素后代中查找
element = parentElement.querySelector(selectors);

参数说明

  • selectors:一个 CSS 选择器字符串,用于匹配元素
    • 可以是标签名、类名、ID、属性选择器、伪类等
    • 支持复杂的 CSS 选择器组合

返回值

  • 返回匹配的第一个元素(即使有多个匹配)
  • 如果没有找到匹配项,返回 null

使用示例

1. 基本选择器

// 通过标签名选择
const div = document.querySelector('div');// 通过类名选择
const item = document.querySelector('.item');// 通过ID选择(虽然不如getElementById高效)
const header = document.querySelector('#header');

2. 组合选择器

// 后代选择器
const listItem = document.querySelector('ul li.first');// 子元素选择器
const directChild = document.querySelector('div > p.special');// 多个选择器(返回第一个匹配的)
const firstMatch = document.querySelector('.class1, .class2, #id1');

3. 属性选择器

// 具有特定属性的元素
const img = document.querySelector('img[alt]');// 属性值匹配
const link = document.querySelector('a[href="https://example.com"]');// 属性值包含
const input = document.querySelector('input[name*="user"]');

4. 伪类选择器

// 第一个子元素
const first = document.querySelector('li:first-child');// 悬停状态的元素(实际只能获取静态匹配)
const hovered = document.querySelector('p:hover'); // 注意:这不会动态更新// nth-child
const third = document.querySelector('tr:nth-child(3)');

5. 从特定元素开始查找

const container = document.querySelector('.container');
// 只在container内查找
const button = container.querySelector('button.primary');

querySelectorAll 的区别

特性querySelectorquerySelectorAll
返回值单个元素(第一个匹配)NodeList(所有匹配元素)
无匹配时返回null空 NodeList(长度为0)
性能略快(找到第一个就停止)需要查找所有匹配项

注意事项

  1. 性能考虑

    • 对于简单的 ID 查找,getElementById 更快
    • 对于简单的类名查找,getElementsByClassName 可能更快
    • 复杂选择器使用 querySelector 更方便
  2. 动态性

    • 返回的是元素的静态引用,不是"活"的集合
    • 如果 DOM 变化,需要重新查询
  3. 错误处理

    // 安全的使用方式
    const element = document.querySelector('.possibly-missing');
    if (element) {element.style.color = 'red';
    }
    
  4. 复杂选择器

    • 支持所有 CSS3 选择器,包括 :not(), :has() 等(注意浏览器兼容性)

实际应用示例

// 查找表单中第一个无效的输入项
const firstInvalid = document.querySelector('form input:invalid');// 查找数据属性匹配的元素
const item = document.querySelector('[data-id="1234"]');// 查找特定状态的复选框
const checkedBox = document.querySelector('input[type="checkbox"]:checked');// 结合多种选择器
const highlight = document.querySelector('.post:not(.read) > .title');

浏览器兼容性

  • 所有现代浏览器都支持(IE8+)
  • 对于非常旧的浏览器,可能需要 polyfill 或使用其他方法

querySelector 是现代 JavaScript 开发中最常用的 DOM 查询方法之一,因为它提供了灵活且强大的选择能力,代码可读性高。

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

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

相关文章

第九讲:C++中的list与forward_list

目录 1、list的介绍及使用 1.1、构造及赋值重载 1.2、迭代器 1.3、空间 1.4、访问 1.5、修改 1.6、操作 2、迭代器失效 3、list的模拟实现 4、forward_list介绍与使用 4.1、构造及赋值重载 4.2、迭代器 4.3、容量 4.4、访问 4.5、修改 4.6、操作 5、迭代器的分…

华为云数据库 GaussDB的 nvarchar2隐式类型转换的坑

bigint 与 nvarchar2比较时发生隐式类型转换的坑 1. 案例分析 假设: table1有下面两个字段:id:bigint, source_id nvarchar2(50)数据库中id 的值一定大于 int4 的最大值,例如存在一条单据: id1947854462980792321&…

spring boot 集成netty,及其一些基本概念

一、基本概念 1、channel:通道,入站或者出站数据的载体 2、ChannelHandler:通道处理器,业务逻辑写在这里面,netty 5版本将入战和出站合并成了ChannelHandler 3、ChannelPipeline:通道里的管道,是一个或者多…

7月23日华为机考真题第一题100分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 bishipass.com 01. 创业投资收益优化 问题描述 K小姐刚刚大学毕业,手头有 m m m 元资金想要进行创业投资。她发现了 k k

HTML5 跨文档通信机制:postMessage API 详解与应用

postMessage 是 HTML5 规范中定义的跨文档通信(Cross-Document Messaging)API,其设计目的是解决不同源(协议、域名、端口任一存在差异)的窗口(如 iframe 嵌入的文档、window.open 创建的新窗口)…

Kafka——Kafka中的位移提交

引言:为什么位移提交至关重要?在Kafka的分布式消息系统中,消费者组(Consumer Group)通过分区分配机制实现负载均衡和容错,但如何准确记录每个消费者的消费进度,是保证消息不丢失、不重复的关键。…

java设计模式 -【装饰器模式】

装饰器模式的定义 装饰器模式(Decorator Pattern)是一种结构型设计模式,允许向一个现有对象动态添加新功能,同时不改变其结构。它通过创建包装对象(装饰器)来包裹原始对象,并在保持原始对象方法…

手写字体生成器:一键模拟真实笔迹

软件介绍 在自媒体创作领域,手写体文案因其独特的艺术感而备受青睐。然而,真实的手写往往效率低下且效果难以保证。今天为大家推荐一款专业的手写模拟软件,能够一键生成逼真的手写字体效果,完美解决创作效率与质量的双重需求。…

【Android】用 ViewPager2 + Fragment + TabLayout 实现标签页切换

文章目录【Android】用 ViewPager2 Fragment TabLayout 实现标签页切换一、引入:什么是 ViewPager2 ?二、ViewPager2 的基础使用1. 在布局文件 (activity_main.xml)中添加 ViewPager22. 制作一个 Fragment2.1 创建一个布局文件2.2 创建一个 Fragment 类…

嵌入式学习-土堆目标检测(4)-day28

Pytorch中加载自定义数据集 - VOC其中需要pip install xmltodict#voc_dataset.pyimport os import torch import xmltodict from PIL import Image from torch.utils.data import Dataset import torchvision.transforms as transformsclass VOCDataset(Dataset): def __init_…

Spring MVC上下文容器在Web容器中是如何启动的(源码深入剖析)?

文章目录一、双容器架构:MVC容器与根容器的关系二、启动全流程解析1. 启动流程全景图2. 初始化根容器(Root WebApplicationContext)2.1 Tomcat 中启动入口源码解析2.2 Spring 根上下文启动源码解析3. 初始化 MVC 容器(DispatcherS…

【iOS】编译和链接、动静态库及dyld的简单学习

文章目录编译和链接1️⃣核心结论:一句话区分2️⃣编译过程:从源代码到目标文件(.o)2.1 预处理(Preprocessing):“替换变量复制粘贴”2.2 编译(Compilation):…

金山办公WPS项目产品总监陈智新受邀为第十四届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会珠海金山办公软件有限公司WPS项目产品总监 陈智新先生 受邀为“PMO评论”主办的2025第十四届中国PMO大会演讲嘉宾,演讲议题为:中小团队PMO的成长之路,敬请关注!议题简要:在竞争激烈、需求多变的…

web安全 | docker复杂环境下的内网打点

本文作者:Track-syst1m一.前言本文涉及的相关漏洞均已修复、本文中技术和方法仅用于教育目的;文中讨论的所有案例和技术均旨在帮助读者更好地理解相关安全问题,并采取适当的防护措施来保护自身系统免受攻击。二.大概流程1. 外网打点• 漏洞利…

iTwin 几何属性获取

面积体积半径获取几何属性,如面积,体积,半径,可以使用getMassProperties这个接口async onGetMassProperty(){const vp IModelApp.viewManager.selectedView;const iModel vp?.iModel;if (!iModel) return;console.log("iM…

OpenLayers 快速入门(九)Extent 介绍

看过的知识不等于学会。唯有用心总结、系统记录,并通过温故知新反复实践,才能真正掌握一二 作为一名摸爬滚打三年的前端开发,开源社区给了我饭碗,我也将所学的知识体系回馈给大家,助你少走弯路! OpenLayers…

LeetCode 121. 买卖股票的最佳时机 LeetCode 122. 买卖股票的最佳时机II LeetCode 123.买卖股票的最佳时机III

LeetCode 121. 买卖股票的最佳时机尝试一:暴力解决方法常用两个指针去遍历prices数组,dp[i]用于记录在第i天所获得的最大利润。时间复杂度是O(N^2),超出时间限制。Codeclass Solution(object):def maxProfit(self, prices):"""…

【LeNet网络架构】——深度学习.卷积神经网络

目录 1 MLP 2 LeNet简介 3 Minst数据集 3.1 MINST数据集简介 3.2 MNIST数据集的预处理 4 LeNet手写数字识别 LeNet由Yann Lecun 提出,是一种经典的卷积神经网络,是现代卷积神经网络的起源之一。Yann将该网络用于邮局的邮政的邮政编码识别&#xff…

Python笔记完整版

常用pip源 (1)阿里云 http://mirrors.aliyun.com/pypi/simple/(2)豆瓣 http://pypi.douban.com/simple/(3)清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/(4)中国科学技术大学…

2025 鸿蒙创新赛又来了,万少教你如何强势切入 HarmonyOS AI特性

2025 鸿蒙创新赛又来了,万少教你如何强势切入 前言 ​ 2025 华为HarmonyOS 创新赛又来了,创新赛是鸿蒙生态最大规模开发者官方赛事,最高获百万激励。 参赛资格 面向所有开发者开放以队伍的形式来参加,可以一个人报名一个队伍&a…