JavaScript选择器函数querySelector和querySelectorAll

2022-07-20,,,,

目录
  • 一、queryselector查询单个元素
    • 1. document实例调用
    • 2. element实例调用
  • 二、queryselectorall查询所有元素
    • 1、for in遍历的问题
    • 2、快照而非实时的问题
  • 三、小结

    选择器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动态效果:

    使用 getelementsbyclassname 获取的对象是 htmlcollection 类型,会随文档流变化而变化。                  

    三、小结

    • 1. queryselectorqueryselectorall根据css选择器获取页面元素,功能很强大。
    • 2. queryselectorall获取的元素是快照,静态的,而非实时的,注意踩坑。

    到此这篇关于 javascript选择器函数queryselectorqueryselectorall的文章就介绍到这了,更多相关 javascript中的queryselector和queryselectorall内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

    《JavaScript选择器函数querySelector和querySelectorAll.doc》

    下载本文的Word格式文档,以方便收藏与打印。