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实现下载远程文件并保存在本地的脚本
May 06 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
Feb 27 Javascript
JavaScript建立一个语法高亮输入框实现思路
Feb 26 Javascript
不间断循环滚动效果的实例代码(必看篇)
Oct 08 Javascript
解决canvas画布使用fillRect()时高度出现双倍效果的问题
Aug 03 Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
Aug 03 Javascript
Js利用Canvas实现图片压缩功能
Sep 13 Javascript
vue学习之mintui picker选择器实现省市二级联动示例
Oct 12 Javascript
微信小程序promsie.all和promise顺序执行
Oct 27 Javascript
通过函数作用域和块级作用域看javascript的作用域链
Aug 05 Javascript
JS简单数组排序操作示例【sort方法】
May 17 Javascript
Vue项目中如何使用Axios封装http请求详解
Oct 23 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/06/05 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
PHP统计目录大小的自定义函数分享
2014/11/18 PHP
php 浮点数比较方法详解
2017/05/05 PHP
jquery教程ajax请求json数据示例
2014/01/13 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
用javascript关闭本窗口不弹出询问框的方法
2014/09/12 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
2016/03/04 Javascript
JavaScript代码性能优化总结(推荐)
2016/05/16 Javascript
详解在vue-cli中使用路由
2017/09/25 Javascript
js实现二级菜单点击显示当前内容效果
2018/04/28 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
vue实现的上拉加载更多数据/分页功能示例
2019/05/25 Javascript
JS利用prototype给类添加方法操作详解
2019/06/21 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
JavaScript代码异常监控实现过程详解
2020/02/17 Javascript
vue学习笔记之Vue中css动画原理简单示例
2020/02/29 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
2021/03/01 Vue.js
python实现查询IP地址所在地
2015/03/29 Python
Python判断文件或文件夹是否存在的三种方法
2017/07/27 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
python内置模块collections知识点总结
2019/12/19 Python
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
一个C/C++编程面试题
2013/11/10 面试题
项目经理岗位职责
2013/11/11 职场文书
日语专业个人的求职信
2013/12/03 职场文书
尽职尽责村干部自我鉴定
2014/01/23 职场文书
市场营销专业求职信
2014/06/17 职场文书
办理房产过户的委托书
2014/09/14 职场文书
教师个人工作总结范文2014
2014/11/10 职场文书
私用公车造成事故检讨书
2014/11/16 职场文书
Nginx 匹配方式
2022/05/15 Servers