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 相关文章推荐
从零开始学习jQuery (十) jQueryUI常用功能实战
Feb 23 Javascript
js监听鼠标事件控制textarea输入字符串的个数
Sep 29 Javascript
jQuery中width()方法用法实例
Dec 24 Javascript
JavaScript获取按钮所在form表单id的方法
Apr 02 Javascript
表单元素值获取方式js及java方式的简单实例
Oct 15 Javascript
JS中数组重排序方法
Nov 11 Javascript
利用vue-router实现二级菜单内容转换
Nov 30 Javascript
深入理解jQuery()方法的构建原理
Dec 05 Javascript
vue.js实现简单轮播图效果
Oct 10 Javascript
关于RxJS Subject的学习笔记
Dec 05 Javascript
vue实现全匹配搜索列表内容
Sep 26 Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
Dec 17 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中上传大体积文件时需要的设置
2006/10/09 PHP
php设计模式 Template (模板模式)
2011/06/26 PHP
Zend的Registry机制的使用说明
2013/05/02 PHP
php命名空间学习详解
2014/02/27 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
seajs加载jquery时提示$ is not a function该怎么解决
2015/10/23 Javascript
JS面试题---关于算法台阶的问题
2016/07/26 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
Nodejs进阶:核心模块net入门学习与实例讲解
2016/11/21 NodeJs
vue.js中created方法作用
2018/03/30 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
继承行为在 ES5 与 ES6 中的区别详解
2019/12/24 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
vuex的数据渲染与修改浅析
2020/11/26 Vue.js
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
浅谈Python单向链表的实现
2015/12/24 Python
Python import与from import使用及区别介绍
2018/09/06 Python
numpy.random.shuffle打乱顺序函数的实现
2019/09/10 Python
python编写猜数字小游戏
2019/10/06 Python
设置jupyter中DataFrame的显示限制方式
2020/04/12 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
scrapy头部修改的方法详解
2020/12/06 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
新颖的化妆品活动方案
2014/08/21 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
八年级上册语文教学计划
2015/01/22 职场文书
爱晚亭导游词
2015/02/09 职场文书
学生会辞职信
2015/03/02 职场文书
建筑工程催款函
2015/06/24 职场文书
会议营销主持词
2015/07/03 职场文书
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android