跳到主要内容位置

选择 DOM 元素

要想修改 HTML 元素,我们需要先在 DOM 树中找到它。而找元素的方式,需要用到一个叫做选择器的概念。

选择器

如果你了解 CSS,那么很简单,DOM 的选择器和 CSS 中的一模一样,不了解也关系,我们来看看几个常用的选择器。

标签选择器

这种选择器,可以根据 HTML 的标签名来选择元素,例如使用 p 可以选择 <p> 元素,使用 div 可以选择 <div> 元素:

<div>
<p>hello</p>
</div>

class 选择器

这种选择器,可以通过 html 的 class 属性来选择元素,语法是 . + class 名字,例如 .text 可以选择下方的 <p> 元素:

<div>
<p class="text">hello</p>
</div>

多个 class 则可以连续使用 class 选择器进行选择,例如 .text.bold:

<div>
<p class="text bold">hello</p>
</div>

ID 选择器

ID 选择器可以通过 HTML 的 id 属性值来选择元素,因为 ID 原则上必须是唯一的,所以这种选择器可以唯一的选择一个元素。ID 选择器的语法是 # + ID 值,例如 #text 可以选择下方的 <p> 元素:

<div>
<p id="text">hello</p>
</div>

多个选择器

如果要同时选择多个元素,可以使用多个选择器,它们之间使用 , 隔开,例如 .container, #text 可以同时选择下方的 div 和 p 元素:

<div class="container">
<p id="text">hello</p>
</div>

关系选择器

关系选择器用于选择和某个元素,有对应关系的元素,例如选择某个元素下的所有子元素、直接子元素,或者选择相邻的元素等。关系选择器的两边可以是标签、id、class 选择器中的任意一种。

对于这段代码,我们分别看一下各个关系选择器的语法和作用:

<div>
<p class="text">hello</p>
<p class="para">world<p class="nested">你好</p></p>
</div>
  • 子元素选择器,是在父子元素选择器之间加个空格,例如 div p 可以选择所有的 p 元素。
  • 直接子元素选择器,是在父子元素之间加上 >,例如 div > p 可以选择 div 下的第一级 p 元素,但不能选择嵌套的 p 元素,即 class 为 nested 的 p 元素。

这些是常见的选择器,更多的选择器可以参考本站 CSS 教程中关于选择器的部分

选择一个元素

在了解了选择器之后,就可以选择元素了。选择元素可以通过 document 对象的 querySelector 方法来实现,它接收选择器字符串作为参数,返回第一个匹配的元素的 DOM 实例。

例如下方示例选择了 class 为 text 的元素:

<div>
<p class="text">hello</p>
</div>
  const p = document.querySelector(".text");

这时,我们在 JavaScript 中保存的 p 元素,就是 <p> 标签在 JavaScript 中的对象表示形式,我们如果打印一下它,它输出的就是原始的 HTML 代码。

我们可以直接在浏览器的控制台里练习 querySelector 的使用方法,例如以本页面为例,选择页面右侧大纲中的第一项:选择器 这个超链接,可以直接在控制台编写下面的代码:

img

document.getElementById()

如果只通过 id 来选择 DOM 元素,可以使用 document.getElementById() 方法,这种方式比使用 querySelector() 的效率略高。它接收要选择的元素的 id 属性值作为参数,不带 #,返回元素的 DOM 实例。例如:

<p id="text">这是一个段落</p>

<script>
const p = document.getElementById("text");
</script>

选择所有元素

如果选择器可以选择多个元素,想获取所有匹配的元素,可以使用 document.querySelectorAll() 方法,它会把所有符合条件的元素实例,作为一个集合返回。

例如,选择页面上所有的 <a> 标签,并打印一下结果:

img

在获取到所有元素的集合之后,可以通过集合的 forEach() 方法来遍历,跟数组一样:

img

或者也可以使用下标,访问集合中特定的元素:

img

document.getElementsByClassName()

如果通过 class 属性值来选择元素,还可以使用 document.getElementsByClassName() 方法。因为 class 可以在多个元素中重复使用,所以这里方法中的 elements 是复数形式,获取所有包含这个 class 选择器的元素。它的参数接收 class 属性值,不带 . 号,例如:

<p class="text">这是一个段落</p>
<p class="text">这是另一个段落</p>

<script>
const p = document.getElementsByClassName("text")
</script>

document.getElementsByTagName()

如果通过标签名来选择元素,也还可以使用 document.getElementsByTagName() 方法,直接给他传递要选择的 HTML 标签的名字就可以了,它会返回所有符合条件的 DOM 元素的集合:

<p>这是一个段落</p>
<p>这是另一个段落</p>

<script>
const p = document.getElementsByTagName("p")
</script>

小结

这就是在 dom 中如何选择元素的方式。利用 CSS 选择器,通过 document.querySelector() 来选择 1 个元素,或者通过 document.querySelectorAll() 来选择所有符合条件的元素。

提示

一系列的课程让你成为高级前端工程师。课程覆盖工作中所有常用的知识点和背后的使用逻辑,示例全部都为工作项目简化而来,学完即可直接上手开发!

即使你已经是高级前端工程师,在课程里也可能会发现新的知识点和技巧,让你的工作更加轻松!

《React 完全指南》课程,包含 React、React Router 和 Redux 详细介绍,所有示例改编自真实工作代码。点击查看详情。

《Vue 3.x 全家桶完全指南与实战》课程,包括 Vue 3.x、TypeScript、Vue Router 4.x、Vuex 4.x 所有初级到高级的语法特性详解,让你完全胜任 Vue 前端开发的工作。点击查看详情。

《React即时通信UI实战》课程,利用 Storybook、Styled-components、React-Spring 打造属于自己的组件库。

《JavaScript 基础语法详解》本人所著图书,包含 JavaScript 全面的语法知识和新特性, 可在京东、当当、淘宝等各大电商购买