JavaScript中选择器函数querySelector和querySelectorAll

选择器是Css非常强大的功能,早先一般是通过getElementById和getElementsByTagName来获取页面元素,在一些场景下就很不方便。

后来DOM扩展出了Selector API标准,其中 Selector API Level 1 包含了querySelector和querySelectorAll两个方法,可以通过Css选择器匹配页面元素。

querySelector查询单个元素

querySelector用于查询页面中第一个符合规则的元素,可以在Document实例和Element实例上调用,接收一个选择器字符串参数,如果查找到则返回 HTMLElement 对象,否则返回null。

语法格式如下:

1Document实例.querySelector(选择器字符串); 2Element实例.querySelector(选择器字符串);

1. Document实例调用

Document实例调用是获取整个页面匹配的元素。

简单示例如下:

1// 获取body元素 2let body = document.querySelector("body"); 3console.log(body) 4 5// 获取id为container的元素,只会获取第一个 6let container = document.querySelector("#container"); 7console.log(container) 8 9// 获取class中包含btn的元素,只会获取第一个 10let btn = document.querySelector(".btn"); 11console.log(btn); 12 13// 获取container直接子类class中包含btn的元素,只会获取第一个 14let containerBtn = document.querySelector("#container>.btn"); 15console.log(containerBtn);

2. Element实例调用

Element实例调用是获取该元素子树内匹配的元素。

简单示例:

1// 获取ID为container的元素 2let container = document.querySelector("#container"); 3// 需要检测元素对象是否存在,存在才有 querySelector 方法 4if (container) { 5 // 只查找 container 内class包含 btn 的元素。 6 let containerBtn = container.querySelector(".btn"); 7 console.log(containerBtn); 8}

理论上来讲,因为Css可以通过选择器获取页面任意的元素,所以Element实例调用可以直接写成Document实例的调用方式,只需要修改选择器字符串参数即可。

例如上例就可以直接写成如下方式:

1let containerBtn = document.querySelector("#container .btn");

并且因为少了一个if判断,代码就更加简洁。当然在有些业务场景下,ELement实例是已经确定的了,那么直接用 ELement实例 调用就更加方便了。

querySelectorAll查询所有元素

querySelectorAll方法和querySelector方法类似,只是它是返回所有匹配的元素,类型是NodeList。

简单示例:

1// 假设页面有两个div类名包含 article 2 3// 获取所有类包含 article 的元素 4let articleList = document.querySelectorAll(".article"); 5console.log(articleList); 6console.log(articleList.length); 7// 控制台输出: 8// NodeList(2) [div.article, div.article] 9// 2

querySelectorAll方法返回的是所有元素,在实务中经常需要遍历,遍历可以使用常规的for遍历、for of遍历和forEach遍历。

1// for of 遍历 2for (let item of articleList) { 3 console.log(item); 4} 5// for 遍历 6for (let i = 0; i < articleList.length; i++) { 7 console.log(articleList[i]); 8 console.log(articleList.item(i)); 9} 10// forEach 遍历 11articleList.forEach((item, index) => { 12 console.log(item, index); 13});

for in遍历的问题

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

快照而非实时的问题

使用querySelectorAll方法获取的NodeList是快照,而非实时的数据。

请看下面这个例子:

1// 使用 querySelectorAll 获取,articleList 是静态的,非实时的 2let articleList = document.querySelectorAll(".article"); 3console.log(articleList); 4console.log(articleList.length); // 2 5 6setTimeout(() => { 7 // 增加一个元素 8 let div = document.createElement("div"); 9 div.className = "article"; 10 document.body.appendChild(div); 11 12 console.log(articleList); 13 // 依旧为2 14 console.log(articleList.length); 15}, 0);

最后设置了一个定时器,往页面塞了一个class为article的div元素,但是 articleList 的长度依旧是2。

如果是用getElementsByClassName获取,那么 articleList 就是实时的数据。请看如下例子:

1// 使用 getElementsByClassName 获取,articleList是实时的 2let articleList = document.getElementsByClassName("article"); 3console.log(articleList); 4console.log(articleList.length); 5 6setTimeout(() => { 7 // 增加一个元素 8 let div = document.createElement("div"); 9 div.className = "article"; 10 document.body.appendChild(div); 11 12 console.log(articleList); 13 // 这里为3 14 console.log(articleList.length); 15}, 0);

在控制台查看打印结果:

1

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

小结

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

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

一篇文章带你了解JavaScript日期

日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用