JavaScript选择器函数querySelector和querySelectorAll


Posted in Javascript onNovember 27, 2021

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

后来DOM扩展出了Selector API标准,其中 Selector API Level 1 包含了querySelectorquerySelectorAll两个方法,可以通过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遍历,则会把原型链上的一些方法也遍历出来,如entriesforEach等。

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

最后设置了一个定时器,往页面塞了一个classarticlediv元素,但是 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动态效果:

JavaScript选择器函数querySelector和querySelectorAll

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

三、小结

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

到此这篇关于 JavaScript选择器函数querySelectorquerySelectorAll的文章就介绍到这了,更多相关 JavaScript中的querySelector和querySelectorAll内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JQuery1.6 使用方法三
Nov 23 Javascript
Jquery选中或取消radio示例
Sep 29 Javascript
Angularjs 基础入门
Dec 26 Javascript
JS Attribute属性操作详解
May 19 Javascript
jsTree使用记录实例
Dec 01 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
Jan 13 Javascript
详解在vue-cli中使用路由
Sep 25 Javascript
JavaScript判断浏览器版本的方法
Nov 03 Javascript
vue引用外部JS的两种种方法
Jan 28 Javascript
jQuery实现回到顶部效果
Oct 19 jQuery
vue中是怎样监听数组变化的
Oct 24 Javascript
vuex的数据渲染与修改浅析
Nov 26 Vue.js
关于JavaScript 中 if包含逗号表达式
Nov 27 #Javascript
JavaScript中MutationObServer监听DOM元素详情
Nov 27 #Javascript
JavaScript中document.activeELement焦点元素介绍
Nov 27 #Javascript
利用JavaScript写一个简单计算器
JavaScript中的宏任务和微任务详情
Nov 27 #Javascript
前端监听websocket消息并实时弹出(实例代码)
Vue实现跑马灯样式文字横向滚动
Nov 23 #Vue.js
You might like
基于mysql的论坛(4)
2006/10/09 PHP
PHP setTime 设置当前时间的代码
2012/08/27 PHP
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
php使浏览器直接下载pdf文件的方法
2013/11/15 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
php 实现Hash表功能实例详解
2016/11/29 PHP
PHP的mysqli_stat()函数讲解
2019/01/23 PHP
javascript web对话框与弹出窗口
2009/02/22 Javascript
将函数的实际参数转换成数组的方法
2010/01/25 Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
2016/11/28 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
react native实现往服务器上传网络图片的实例
2017/08/07 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
vue+iview写个弹框的示例代码
2017/12/05 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
2018/01/12 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
ant design的table组件实现全选功能以及自定义分页
2020/11/17 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
python logging.info在终端没输出的解决
2020/05/12 Python
CSS3 中filter(滤镜)属性使用详解
2020/04/07 HTML / CSS
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
网上书店创业计划书
2014/01/12 职场文书
《骆驼和羊》教学反思
2014/02/27 职场文书
行政内勤岗位职责
2014/04/07 职场文书
小学优秀班主任材料
2014/12/17 职场文书
党章学习心得体会2016
2016/01/14 职场文书
分析Java中Map的遍历性能问题
2021/06/26 Java/Android
Go 通过结构struct实现接口interface的问题
2021/10/05 Golang