六维教程

JavaScript 获取 DOM 元素

上一篇认识了 DOM 树,这一篇解决第一步,怎么从树上把想要的元素拿下来。拿不到元素,后面所有操作都是空谈。本篇介绍三个方法,getElementById 按 id 拿,querySelector 和 querySelectorAll 按 CSS 选择器拿,一套选择器走天下。

document.getElementById()

给元素加 id,就能按 id 直接取到它。id 在页面里唯一,所以结果永远是单个元素。

<h1 id="title">你好</h1>
const title = document.getElementById('title');
console.log(title);            // 元素
console.log(title.textContent) // 你好

id 必须保持唯一,同一个 id 出现两次属于写错了,浏览器只会返回第一个。

document.querySelector()

querySelector 接受 CSS 选择器,返回第一个匹配的元素。id 选择器用 # 开头,class 选择器用 . 开头,标签选择器直接写标签名。

<h1 id="title">你好</h1>
<p class="intro">第一段</p>
<p class="intro">第二段</p>
<ul>
  <li>苹果</li>
  <li>香蕉</li>
</ul>
const title = document.querySelector('#title');    // 按 id 取
const intro = document.querySelector('.intro');    // 按 class 取,得到第一个匹配
const li = document.querySelector('li');           // 按标签取,得到第一个 li
const firstItem = document.querySelector('ul li'); // 组合选择器,ul 里的第一个 li

写法和你写 CSS 一模一样,会写 CSS 选择器就会用 querySelector,不用再记第二套规则,这就是推荐它的原因。

document.querySelectorAll()

取所有匹配的元素,返回一个 NodeList,它长得像数组,可以用索引访问,也有 length 属性。

<p class="intro">第一段</p>
<p class="intro">第二段</p>
const intros = document.querySelectorAll('.intro');
console.log(intros.length); // 2,匹配到了两个
console.log(intros[0]);     // 第一个 p 元素

NodeList 支持 for…of 遍历,遍历的写法跟数组一样,具体技巧可以回顾 JavaScript 遍历数组

const intros = document.querySelectorAll('.intro');

for (const p of intros) {
  console.log(p.textContent);
}
// 第一段
// 第二段

找不到元素时返回 null

querySelector 找不到匹配的元素时返回 null,getElementById 也一样。null 没有 textContent 这些属性,不判断就直接用会报错,所以拿到元素后先判断再使用是稳妥的习惯。

const box = document.querySelector('.not-exist');

if (box) {
  console.log(box.textContent); // 元素存在才执行
} else {
  console.log('没找到这个元素');
}

小结

  • getElementById 按 id 获取单个元素。
  • querySelector 按 CSS 选择器获取第一个匹配的元素。
  • querySelectorAll 获取所有匹配的元素,返回 NodeList。
  • CSS 选择器怎么写,querySelector 就怎么用,一套选择器走天下。
  • 找不到元素时返回 null,使用前先判断。
  • NodeList 可以用 for…of 遍历。
  • 下一篇讲拿到元素之后怎么修改它的内容和属性。
上一篇
JavaScript 认识 DOM
下一篇
JavaScript 操作 DOM 内容与属性