发布于 2026-01-06 2 阅读
0

HTMLCollection 和 NodeList 的区别

HTMLCollection 和 NodeList 的区别

最近我一直在使用 JavaScript 进行 DOM 操作,我发现可以通过类名以两种方式获取一组元素:

  1. document.getElementsByClassName()
  2. document.querySelectorAll()

然而,它们之间并没有绝对的优劣之分,因为应该根据我们HTML的结构和实际需求来选择使用。但是!重要的是,我们必须考虑每种方法的输出结果,并理解它们的工作原理。

理论

根据 MDN 文档:

  1. getElementsByClassName()返回一个实时对象HTMLCollection,表示具有给定类名的所有子元素的数组对象。
  2. querySelectorAll()返回一个静态(非实时)对象,NodeList表示文档中与指定选择器组匹配的元素列表。

live HTMLCollection话虽如此,我还是忍不住问自己:a和 a到底是什么意思static NodeList?接下来,让我用更清晰的方式向你解释一下它们之间的区别。

动手实践

让我们来看一下下面的 HTML 结构:



<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Demo</title>
  </head>
  <body>
    <ul id="list">
      <li class="item">First Item</li>
      <li class="item">Second Item</li>
      <li class="item">Third Item</li>
    </ul>
    <script src="script.js"></script>
  </body>
</html>


Enter fullscreen mode Exit fullscreen mode

item现在,让我们用上面提到的两种方法,通过类名获取项目:

图1

我们可以看到,两者都包含了我在类中需要的所有元素item。然而,它们返回的数据结构却存在很大的差异。

现在,让我们<li>向列表中添加一个新元素,并向script.js文件中添加一些 JavaScript 代码。



//get UL element
const list = document.getElementById('list');

//Get items by class name (two ways)
const itemsByClassName = document.getElementsByClassName('item');
const itemsByQuerySelector = document.querySelectorAll('.item');

console.log('First console log', itemsByClassName, itemsByQuerySelector);

//adding the fourth element
list.innerHTML += `<li class="item">Fourth Item</li>`;

console.log('Second console log', itemsByClassName, itemsByQuerySelector);


Enter fullscreen mode Exit fullscreen mode

让我们看看结果!

替代文字

我们可以看到新项目已添加到列表中,但是,列表HTMLCollection已更新为第四个项目,而列表NodeList仍然包含前三个元素,它没有意识到我们的列表发生了变化。

HTMLCollection因此,这就是动态数据结构和静态数据结构之间的主要区别NodeList。首先,动态数据结构HTMLCollection会在每次检测到方法检索到的数据项发生变化时自动更新。另一方面,静态数据结构NodeList自执行之日起就保持不变,无论 HTML 代码发生何种变化。

结论

总而言之,您可以随意使用它们,但请考虑它们之间的巨大差异,以便根据您的需求决定哪一个更适合您。

更多信息,请查看以下资源:

感谢阅读!

文章来源:https://dev.to/jharteaga/difference- Between-htmlcollection-and-nodelist-25bp