myfreax
dom

JavaScript querySelector 选择元素

您将学习如何使用 JavaScript querySelector 以及 querySelectorAll 如何基于 CSS 选择器查找元素

6 min read
By myfreax
JavaScript querySelector 选择元素
JavaScript querySelector 选择元素

在本教程中,您将学习如何使用 JavaScript  querySelector 以及 querySelectorAll 如何基于 CSS 选择器查找元素。

JavaScript querySelector 和 querySelectorAll 方法简介

querySelectorElement 接口的方法。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

以下示例查找第一个具有 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 选择器。