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 相关文章推荐
js计数器代码
Nov 04 Javascript
javascript radio 联动效果
Mar 04 Javascript
JQuery最佳实践之精妙的自定义事件
Aug 11 Javascript
javascript简单实现类似QQ头像弹出效果的方法
Aug 03 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
Jan 19 Javascript
简单易懂的天气插件(代码分享)
Feb 04 Javascript
svg动画之动态描边效果
Feb 22 Javascript
微信小程序 数据遍历的实现
Apr 05 Javascript
浅谈AngularJS中$http服务的简单用法
May 15 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
Aug 22 Javascript
JS实现简单的抽奖转盘效果示例
Feb 16 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
Aug 04 Javascript
关于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
PHP判断图片格式的七种方法小结
2013/06/03 PHP
Linux环境下搭建php开发环境的操作步骤
2013/06/17 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
CodeIgniter多语言实现方法详解
2016/01/20 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
网页自动刷新,不产生嗒嗒声的一个解决方法
2007/03/27 Javascript
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
JS 控制非法字符的输入代码
2009/12/04 Javascript
jQuery最佳实践完整篇
2011/08/20 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
js中的json对象详细介绍
2014/10/29 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
JavaScript数据类型学习笔记分享
2016/09/01 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
JS实现的Unicode编码转换操作示例
2017/04/28 Javascript
去掉vue 中的代码规范检测两种方法(Eslint验证)
2018/03/21 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
python操作toml文件的示例代码
2020/11/27 Python
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
中国医药集团国药在线:国药网
2017/02/06 全球购物
大学生求职信范文应怎么写
2014/01/01 职场文书
阳光体育活动方案
2014/02/16 职场文书
安全生产实施方案
2014/02/23 职场文书
好的旅游活动方案
2014/08/19 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
go语言中fallthrough的用法说明
2021/05/06 Golang
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang