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 open() 与showModalDialog()方法使用介绍
Sep 10 Javascript
js构造函数、索引数组和属性的实现方式和使用
Nov 16 Javascript
纯javascript代码实现计算器功能(三种方法)
Sep 07 Javascript
Node.js实现数据推送
Apr 14 Javascript
详解Backbone.js框架中的模型Model与其集合collection
May 05 Javascript
JavaScript中的各种操作符使用总结
May 26 Javascript
jQuery中DOM节点删除之empty与remove
Jan 20 Javascript
原生js仿淘宝网商品放大镜效果
Feb 28 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
Apr 22 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
May 06 Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
Apr 01 Javascript
解决vue 给window添加和移除resize事件遇到的坑
Jul 21 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 危险函数解释 分析
2009/04/22 PHP
深入PHP与浏览器缓存的分析
2013/06/03 PHP
使用php统计字符串中中英文字符的个数
2013/06/23 PHP
浅析十款PHP开发框架的对比
2013/07/05 PHP
PHP函数实现分页含文本分页和数字分页
2014/10/23 PHP
模仿jQuery each函数的链式调用
2009/07/22 Javascript
Java 正则表达式学习总结和一些小例子
2012/09/13 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
2015/07/09 Javascript
最佳的JavaScript错误处理实践
2016/07/16 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
基于AngularJS的拖拽文件上传的实例代码
2017/07/15 Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
2017/08/16 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
JavaScript原型继承和原型链原理详解
2020/02/04 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
Vue使用自定义指令实现拖拽行为实例分析
2020/06/06 Javascript
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
python实现人性化显示金额数字实例详解
2020/09/25 Python
Dockers美国官方网站:卡其裤、男士服装、鞋及配件
2016/11/22 全球购物
Andrew Marc官网:设计师外套的领先制造商
2019/10/30 全球购物
剪枝的学问教学反思
2014/02/07 职场文书
出纳员岗位责任制
2014/02/11 职场文书
《美丽的彩虹》教学反思
2014/02/25 职场文书
办公室副主任职责范本
2014/03/08 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript
基于Redis结合SpringBoot的秒杀案例详解
2021/10/05 Redis