JavaScript中选择器函数querySelector和querySelectorAll

晴空闲云 等级 91 0 0

选择器是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);
});

for in遍历的问题

如果使用for in遍历,则会把原型链上的一些方法也遍历出来,如entries,forEach等。

快照而非实时的问题

使用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);

在控制台查看打印结果:

JavaScript中选择器函数querySelector和querySelectorAll

使用 getElementsByClassName 获取的对象是 HTMLCollection 类型,会随文档流变化而变化。

小结

  1. querySelector和querySelectorAll根据Css选择器获取页面元素,功能很强大。
  2. querySelectorAll获取的元素是快照,静态的,而非实时的,注意踩坑。
收藏
评论区

相关推荐

《css大法》之使用伪元素实现超实用的图标库(附源码
今天我们来复盘一下前端中css伪元素的知识以及如何用css伪元素来减轻javascript的压力,做出一些脑洞大开的图形。 预备知识 伪元素 伪元素是一个附
只听说过CSS in JS,怎么还有JS in CSS?
CSS in JS是一种解决css问题想法的集合,而不是一个指定的库。从CSS in JS的字面意思可以看出,它是将css样式写在JavaScript文件中,而不需要独立出.css、.less之类的文件。将css放在js中使我们更方便的使用js的变量、模块化、treeshaking。还解决了css中的一些问题,譬如:更方便解决基于状态的样式,更容易追溯依赖关
你可能不知道的10个CSS新功能(2021版)
多年来,CSS已经超越了背景颜色、边框、文本样式、边距和盒模型。现代CSS能够提供一系列的功能,而在过去,您需要JavaScript或变通方法来实现这些功能。 为了庆祝它在2021年取得的成就,在这篇文章中,我们想看看一些你可能不知道的令人惊叹的CSS新特性。我们将强调web设计人员和开发人员可以用现代CSS做的很酷的事情,讨论用例,浏览器支持,并给你一个
23、Django实战第23天:视频播放页面
打开素材course-play.html,会发现播放页面处了包含播放器,其他和“章节”页面一样。 1、把course-play.html复制到template目录下 2、把下面两段代码拷贝出来 <link rel="stylesheet" type="text/css" href="../css/video-js.min.css">
Array.prototype.slice.call()的理解
最近在看廖雪峰的JS课程,浏览器中的操作DOM的那一章,有这样一道题。 * JavaScript * Swift * HTML * ANSI C * CSS * DirectX <!-- HTML结构 --> <ul id="test-list"> <li>JavaScript</li>
GitHub标星13.1k,JavaScript基础知识必知(一)!前端入门必看!
JavaScript背景 ------------ Web前端有三层: * HTML:从语义的角度,描述页面**结构** * CSS:从审美的角度,描述**样式**(美化页面) * JavaScript:从交互的角度,描述**行为**(实现业务逻辑和页面控制) ### 发展历史 JavaScript诞生于**
JavaScript template engine in just 20 lines
I'm still working on my JavaScript based preprocessor - [AbsurdJS](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fkrasimirtsonev.com%2Fblog%2Farticle%2FAbsurdJS-fundament
JavaScript基础知识
**1:从一个界面跳转到其他界面** window.location.href="b.html" **2:判断变量是否为空** typeof obj == 'undefined' || obj == null || obj == "" **3:html引用公用的css和js** <script type="text/javascript" src=
JavaScript的入门简介
#### 什么是 JavaScript JavaScript,我们一般简称为 JS,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。 JavaScript 现在已经被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并支持面向对象、命令式和声明式风格。 HTML、CSS、JavaScript三者不同的功能:
JavaScript的前世今生
[JavaScript的前世今生](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fwww.cnblogs.com%2Fdongtianee%2Fp%2F4492665.html) ========================================================
JavaScript零基础入门——(十二)JavaScript的定时器
JavaScript零基础入门——(十二)JavaScript的定时器 =================================== 大家好,欢迎回到我们的JavaScript零基础入门。上一节课我们讲了JavaScript中一些常用的DOM操作,这里要补充一个点,上节课讲的table几个常用属性其实是有兼容性问题的,在部分IE浏览器中是不识别的
Javascript基础知识学习(三)
**前言:** javascript是一种轻量的、动态的脚本语言,我们为什么要使用javascript ?对于一个网页的设计,.html用来放置网页的内容,.css则用来设计网页的样式和布局,那么.js它主要是使网页能够产生交互,意思就是能够通过代码动态的修改HTML、操作CSS、响应事件、获取用户计算机的相关信息等。javascript不是所有的浏览器
MiniUi遇到的一个Bug或者说坑,以div里面的内容自适应高度
页面源码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <link href="css/demo.css" rel="stylesheet" type="tex
Prestashop中文模版制作指南
**Prestashop Css Layout** **图****:** 这是PrestaShop的Css Layout,方便大家知道主要的结构: **关于设计整合****PrestaShop****的介****绍 :** 网页设计师只需要掌握好比较好的HTML和CSS技术便能改变Prestashop的外观,如果想进一步的改变,甚至加些比默认模版更绚丽
JavaScript中选择器函数querySelector和querySelectorAll
选择器是Css非常强大的功能,早先一般是通过getElementById和getElementsByTagName来获取页面元素,在一些场景下就很不方便。后来DOM扩展出了Selector API标准,其中 Selector API Level 1 包含了querySelector和querySelectorAll两个方法,可以通过Css选择器匹配页面元素。