JavaScript 选择器函数 querySelector 和 querySelectorAll 详解
本文详细介绍 JavaScript 中 querySelector 和 querySelectorAll 的用法。querySelector 返回首个匹配元素,querySelectorAll 返回所有匹配元素组成的 NodeList。重点解析 NodeList 的静态快照特性与 getElementsByClassName 返回的 HTMLCollection 实时动态特性的区别,并对比 for、for...of 及 forEach 遍历方式,帮助开发者避免常见陷阱。
选择器是 Css 非常强大的功能,早先一般是通过 getElementById 和 getElementsByTagName 来获取页面元素,在一些场景下就很不方便。
后来 DOM 扩展出了 Selector API 标准,其中 Selector API Level 1 包含了 querySelector 和 querySelectorAll 两个方法,可以通过 Css 选择器匹配页面元素。
一、querySelector 查询单个元素
querySelector 用于查询页面中第一个符合规则的元素,可以在 Document 实例和 Element 实例上调用,接收一个选择器字符串参数,如果查找到则返回 HTMLElement 对象,否则返回 null。
语法格式如下:
Document实例.querySelector(选择器字符串);
Element实例.querySelector(选择器字符串);
1. Document 实例调用
Document 实例调用是获取整个页面匹配的元素。
简单示例如下:
// 获取body元素
let body = document.querySelector("body");
console.log(body)
// 获取id为container的元素,只会获取第一个
let container = document.querySelector("#container");
console.log(container)
// 获取class中包含btn的元素,只会获取第一个
let btn = document.querySelector(".btn");
console.log(btn);
// 获取container直接子类class中包含btn的元素,只会获取第一个
let containerBtn = document.querySelector("#container>.btn");
console.log(containerBtn);
2. Element 实例调用
Element 实例调用是获取该元素子树内匹配的元素。
简单示例:
// 获取ID为container的元素
let container = document.querySelector("#container");
// 需要检测元素对象是否存在,存在才有 querySelector 方法
if (container) {
// 只查找 container 内class包含 btn 的元素。
let containerBtn = container.querySelector(".btn");
console.log(containerBtn);
}
理论上来讲,因为 Css 可以通过选择器获取页面任意的元素,所以 Element 实例调用可以直接写成 Document 实例的调用方式,只需要修改选择器字符串参数即可。
例如上例就可以直接写成如下方式:
let containerBtn = document.querySelector("#container .btn");
并且因为少了一个 if 判断,代码就更加简洁。当然在有些业务场景下,ELement 实例是已经确定的了,那么直接用 ELement 实例调用就更加方便了。
二、querySelectorAll 查询所有元素
querySelectorAll 方法和 querySelector 方法类似,只是它是返回所有匹配的元素,类型是 NodeList。
简单示例:
// 假设页面有两个div类名包含 article
// 获取所有类包含 article 的元素
let articleList = document.querySelectorAll(".article");
console.log(articleList);
console.log(articleList.length);
// 控制台输出:
// NodeList(2) [div.article, div.article]
// 2
querySelectorAll 方法返回的是所有元素,在实务中经常需要遍历,遍历可以使用常规的 for 遍历、for of 遍历和 forEach 遍历。
// for of 遍历
for (let item of articleList) {
console.log(item);
}
// for 遍历
for (let i = 0; i < articleList.length; i++) {
console.log(articleList[i]);
console.log(articleList.item(i));
}
// forEach 遍历
articleList.forEach((item, index) => {
console.log(item, index);
});
1、for in 遍历的问题
如果使用 for in 遍历,则会把原型链上的一些方法也遍历出来,如 entries,forEach 等。
2、快照而非实时的问题
使用 querySelectorAll 方法获取的 NodeList 是快照,而非实时的数据。
请看下面这个例子:
// 使用 querySelectorAll 获取,articleList 是静态的,非实时的
let articleList = document.querySelectorAll(".article");
console.log(articleList);
console.log(articleList.length); // 2
setTimeout(() => {
// 增加一个元素
let div = document.createElement("div");
div.className = "article";
document.body.appendChild(div);
console.log(articleList);
// 依旧为2
console.log(articleList.length);
}, 0);
最后设置了一个定时器,往页面塞了一个 class 为 article 的 div 元素,但是 articleList 的长度依旧是 2。
如果是用 getElementsByClassName 获取,那么 articleList 就是实时的数据。
请看如下例子:
// 使用 getElementsByClassName 获取,articleList是实时的
let articleList = document.getElementsByClassName("article");
console.log(articleList);
console.log(articleList.length);
setTimeout(() => {
// 增加一个元素
let div = document.createElement("div");
div.className = "article";
document.body.appendChild(div);
console.log(articleList);
// 这里为3
console.log(articleList.length);
}, 0);
在控制台查看打印结果:
HTMLCollection 动态效果:

使用 getElementsByClassName 获取的对象是 HTMLCollection 类型,会随文档流变化而变化。
三、小结
- 1.
querySelector和querySelectorAll根据 Css 选择器获取页面元素,功能很强大。 - 2.
querySelectorAll获取的元素是快照,静态的,而非实时的,注意踩坑。
到此这篇关于 JavaScript 选择器函数 querySelector 和 querySelectorAll 的文章就介绍到这了,更多相关 JavaScript 中的 querySelector 和 querySelectorAll 内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
JavaScript入门书籍避坑:这些书不适合初学者
2026-11-05 16:31:15
JS使用Math.round实现保留两位小数的原理与代码
2026-11-05 15:35:55
JavaScript 原生 Date 对象怎么实现日期加减
2026-11-05 14:30:00
JavaScript函数定义的三种方式:声明、表达式与箭头函数
2026-11-05 13:50:55
JavaScript中escape、encodeURI和encodeURIComponent对空格的处理差异
2026-11-05 12:47:23
