在本教程中,您将学习如何使用 JavaScript querySelector 以及 querySelectorAll 如何基于 CSS 选择器查找元素。
querySelector 是 Element 接口的方法。querySelector 方法允许您选择与一个或多个 CSS 选择器匹配的第一个元素。
下面是 querySelector 方法的语法:
let element = parentNode.querySelector(selector);
在此语法中,selector 是一个 CSS 选择器或一组 CSS 选择器,用于匹配 parentNode 的后代元素。
如果 selector 的 CSS 语法无效,该方法将抛出 SyntaxError 语法错误异常 。如果没有元素与 CSS 选择器匹配,则 querySelector 方法返回 null。
querySelector 方法可用于 document 对象或任何Element 对象。
除了 querySelector 方法之外,您还可以使用 querySelectorAll 方法来选择与一个 CSS 选择器或一组 CSS 选择器匹配的所有元素:
let elementList = parentNode.querySelectorAll(selector);
querySelectorAll 方法返回与 CSS 选择器匹配的元素 NodeList。如果没有元素匹配,则返回空的 NodeList。
请注意,NodeList 是一个类似数组的对象,而不是数组对象。但是,在现代 Web 浏览器,您可以使用 forEach 方法或 for...of 进行遍历。
要将 NodeList 转换为数组,可以使用 Array.from() 方法:
let nodeList = document.querySelectorAll(selector);
let elements = Array.from(nodeList);
假设您有如下 HTML 文档:
<!DOCTYPE html>
<html lang="en">
<head>
<title>querySelector() Demo</title>
</head>
<body>
<header>
<div id="logo">
<img src="img/logo.jpg" alt="Logo" id="logo">
</div>
<nav class="primary-nav">
<ul>
<li class="menu-item current"><a href="#home">Home</a></li>
<li class="menu-item"><a href="#services">Services</a></li>
<li class="menu-item"><a href="#about">About</a></li>
<li class="menu-item"><a href="#contact">Contact</a></li>
</ul>
</nav>
</header>
<main>
<h1>Welcome to the JS Dev Agency</h1>
<div class="container">
<section class="section-a">
<h2>UI/UX</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Autem placeat, atque accusamus voluptas
laudantium facilis iure adipisci ab veritatis eos neque culpa id nostrum tempora tempore minima.
Adipisci, obcaecati repellat.</p>
<button>Read More</button>
</section>
<section class="section-b">
<h2>PWA Development</h2>
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Magni fugiat similique illo nobis quibusdam
commodi aspernatur, tempora doloribus quod, consectetur deserunt, facilis natus optio. Iure
provident labore nihil in earum.</p>
<button>Read More</button>
</section>
<section class="section-c">
<h2>Mobile App Dev</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Animi eos culpa laudantium consequatur ea!
Quibusdam, iure obcaecati. Adipisci deserunt, alias repellat eligendi odit labore! Fugit iste sit
laborum debitis eos?</p>
<button>Read More</button>
</section>
</div>
</main>
<script src="js/main.js"></script>
</body>
</html>
通用选择器使用 * 匹配所有元素,以下示例使用 querySelector() 方法选择 HTML 文档中的第一个元素:
let element = document.querySelector('*');
在 querySelectorAll 方法使用通用选择器 * 将会选择文档中的所有元素:
let elements = document.querySelectorAll('*');
要按元素名称(标签名)名称选择元素,请使用类型选择器,例如 a 选择所有 <a> 元素:
下面的示例查找 HTML 文档中的第一个 h1 元素:
let firstHeading = document.querySelector('h1');
以下示例查找所有 h2 元素:
let heading2 = document.querySelectorAll('h2');
要查找具有指定 CSS 类名的元素,可以使用类选择器语法:
.className
以下示例查找类名是 menu-item 的第一个元素:
let note = document.querySelector('.menu-item');
以下示例查找类名是 menu 的所有元素:
let notes = document.querySelectorAll('.menu-item');
要根据 id 的值选择元素,请使用 id 选择器语法:
#id
以下示例查找第一个具有 id 是 #logo 的元素:
let logo = document.querySelector('#logo');
由于 id 在文档中是唯一的,因此不需要使用 querySelectorAll 方法。
要选择具有指定属性的所有元素,请使用下面属性选择器语法之一:
[attribute]
[attribute=value]
[attribute~=value]
[attribute|=value]
[attribute^=value]
[attribute$=value]
[attribute*$*=value]
以下示例查找任意属性值是 [autoplay] 的第一个元素:
let autoplay = document.querySelector('[autoplay]');
以下示例查找任意属性值是 [autoplay] 的所有元素:
let autoplays = document.querySelectorAll('[autoplay]');
要将多个选择器分组。请使用以下语法:
selector, selector, ...
以下示例查找所有 <div> 和 <p> 元素:
let elements = document.querySelectorAll('div, p');
要查找节点的后代,可以使用空格分隔的后代组合器语法:
selector selector
例如 p a 将匹配元素 p 内的所有 a 元素:
let links = document.querySelector('p a');
子组合器 > 被放在两个 CSS 选择器之间。它只匹配那些被第二个选择器匹配的元素,这些元素是被第一个选择器匹配的元素的直接子元素:
selector > selector
以下示例选择位于 <ul> 元素内部的所有 li 元素:
let listItems = document.querySelectorAll('ul > li');
要选择位于 <ul> 且类名是 nav 内部的所有 li 元素:
let listItems = document.querySelectorAll('ul.nav > li');
后续兄弟选择器 ~ 将两个选择器分开,并匹配第二个选择器的所有元素,位置无须紧邻于第一个元素,只须有相同的父级元素。
selector ~ selector
例如,p ~ a 匹配 p 元素后面的所有 a 元素:
let links = document.querySelectorAll('p ~ a');
接续兄弟选择器 + 介于两个选择器之间,当第二个元素紧跟在第一个元素之后,并且两个元素都是属于同一个父元素的子元素,则第二个元素将被选中。
selector + selector
例如,h1 + a 匹配 h1 紧邻的所有 a 元素:
let links = document.querySelectorAll('h1 + a');
下面的示例选择第一个 h1 紧跟在后面的 a 元素:
let links = document.querySelector('h1 + a');
伪 : 基于其状态匹配元素:
element:state
例如,li:nth-child(2) 选择列表中的第二个 <li> 元素:
let listItem = document.querySelectorAll('li:nth-child(2)');
:: 代表未包含在 HTML 文档的实体。例如, p::first-line 匹配所有 p 元素的第一行。
let links = document.querySelector('p::first-line');
querySelector() 查找与一个 CSS 选择器或一组 CSS 选择器匹配的第一个元素。querySelectorAll() 查找与一个 CSS 选择器或一组 CSS 选择器匹配的所有元素。CSS 规则适用的定义 CSS 选择器。