css querySelector querySelectorAll (五)

 

选择器是Css非常强大的功能,早先一般是通过getElementById和getElementsByTagName来获取页面元素,在一些场景下就很不方便。

后来DOM扩展出了Selector API标准,其中 Selector API Level 1 包含了querySelector和querySelectorAll两个方法,可以通过Css选择器匹配页面元素。

一、querySelector查询单个元素

querySelector用于查询页面中第一个符合规则的元素,可以在Document实例和Element实例上调用,接收一个选择器字符串参数,如果查找到则返回 HTMLElement 对象,否则返回null。

语法格式如下:

document.querySelector(CSS selectors)
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遍历,则会把原型链上的一些方法也遍历出来,如entries,forEach等。

2、快照而非实时的问题

使用querySelectorAll方法获取的NodeList是快照,而非实时的数据。如果是用getElementsByClassName获取,那么 就是实时的数据。

 三、小结

1. querySelector和querySelectorAll根据Css选择器获取页面元素,功能很强大。

2. querySelectorAll获取的元素是快照,静态的,而非实时的,注意踩坑。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/weixin_45063953/article/details/132534621

  

 

 var child = document.querySelector(".child");
      var node = child.parentNode;
      //child.childNodes 子节点
      // child.children 子节点集合
      // child.previousSibling 前一个同辈节点
      // child.previousElementSibling 前一个同辈元素
      // child.nextSibling 兄弟元素节点
      //child.nextElementSibling 兄弟元素
      console.log(node);

 

 <script>
      var ul = document.querySelector("ul");
      var li = document.createElement("li");
      ul.append(li);//追加节点
      var li1 = document.createElement("li");
      ul.insertBefore(li1, ul.children[1]);//插入节点 到 子节点某个索引下
    </script>

  

 

localStorage.setItem("user", "yyy");
      localStorage.getItem("user");
      localStorage.removeItem("user");
      localStorage.clear();

      sessionStorage.getItem("user", "yyy");
      sessionStorage.getItem("user");
      sessionStorage.removeItem("user");
      sessionStorage.clear();

  

 

posted on 2024-09-07 22:38  是水饺不是水饺  阅读(47)  评论(0)    收藏  举报

导航