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 相关文章推荐
javascript 一个函数对同一元素的多个事件响应
Jul 25 Javascript
js变量以及其作用域详解
Jul 18 Javascript
js 连接数据库如何操作数据库中的数据
Nov 23 Javascript
javascript中验证大写字母、数字和中文
Jan 15 Javascript
原生JavaScript编写俄罗斯方块
Mar 30 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
Jan 12 Javascript
jQuery EasyUI Tab 选项卡问题小结
Aug 16 Javascript
详解vue过滤器在v2.0版本用法
Jun 01 Javascript
jQuery基于cookie实现换肤功能实例
Oct 14 jQuery
React key值的作用和使用详解
Aug 23 Javascript
vue页面切换项目实现转场动画的方法
Nov 12 Javascript
Vue select 绑定动态变量的实例讲解
Oct 22 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
建立动态的WML站点(二)
2006/10/09 PHP
Yii2 rbac权限控制之rule教程详解
2016/06/23 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
Javascript实现的分页函数
2006/12/22 Javascript
List Information About the Binary Files Used by an Application
2007/06/11 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
webpack入门必知必会
2017/01/16 Javascript
微信小程序实现实时圆形进度条的方法示例
2017/02/24 Javascript
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
Angular 4环境准备与Angular cli创建项目详解
2017/05/27 Javascript
protractor的安装与基本使用教程
2017/07/07 Javascript
javascript编程开发中取色器及封装$函数用法示例
2017/08/09 Javascript
为输入框加入数字js校验代码分享
2017/11/02 Javascript
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
jQuery实现左右两个列表框的内容相互移动功能示例
2019/01/27 jQuery
JavaScript箭头函数中的this详解
2019/06/19 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
python获取酷狗音乐top500的下载地址 MP3格式
2018/04/17 Python
详解python中__name__的意义以及作用
2019/08/07 Python
Python3 sys.argv[ ]用法详解
2019/10/24 Python
Python流程控制常用工具详解
2020/02/24 Python
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
司机辞职报告范文
2014/01/20 职场文书
护士自我评价
2014/02/01 职场文书
学校消防演习方案
2014/02/19 职场文书
毕业论文致谢词
2015/05/14 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书
了解MySQL查询语句执行过程(5大组件)
2022/08/14 MySQL