NodeList是什么?

在前端开发中,我们经常需要操作 DOM 元素。当我们使用 document.querySelectorAll() 或者 element.querySelectorAll() 查询到一组元素时,得到的就是一个 NodeList 对象。

NodeList 是一个类数组对象(array-like object),它表示了一个包含零个或多个节点的列表,每个节点都有一个对应的整数索引。与真正的数组不同,NodeList 不能被修改(例如,你不能使用 push、pop 等方法)。但是,你可以通过索引访问其中的节点并使用 length 属性获取其长度。

NodeList 是否 live 还是 static

对于一个 NodeList 对象,它的 live 或者 static 特性取决于如何获取该对象。

Live NodeList

如果通过以下方式获取 NodeList 对象:

----- -------- - ---------------------------------

那么这个 NodeList 就是 live 的。这意味着当文档结构发生变化时(例如增加、删除或者移动节点),NodeList 会自动更新,以反映出最新的文档结构。

例如,假设我们有以下 HTML 结构:

------
  -----------
-------

我们可以通过以下代码获取 NodeList:

----- -------- - ---------------------------------
----------------------------- -- -- -

现在,在 JavaScript 中添加一个新的 div 元素:

----- ------ - ------------------------------
----------------------------------

再次查看 NodeList 的长度:

----------------------------- -- -- -

可以看到,NodeList 已经自动更新了,以反映出最新的文档结构。

Static NodeList

如果通过以下方式获取 NodeList 对象:

----- -------- - ---------------------------------------------

那么这个 NodeList 就是 static 的。这意味着当文档结构发生变化时,NodeList 不会自动更新,仍然保持最初查询时的结果。

例如,假设我们有以下 HTML 结构:

------
  -----------
-------

我们可以通过以下代码获取 NodeList:

----- -------- - ---------------------------------------------
----------------------------- -- -- -

现在,在 JavaScript 中添加一个新的 div 元素:

----- ------ - ------------------------------
----------------------------------

再次查看 NodeList 的长度:

----------------------------- -- ---- -

可以看到,NodeList 没有更新以反映出最新的文档结构。

如何使用

对于 live 和 static 的 NodeList,我们可以使用相同的方法来访问其中的节点。例如,我们可以使用索引来访问其中的节点:

----- -------- - ---------------------------------
----- -------- - ------------

或者我们可以使用 forEach 方法迭代其中的每个节点:

----- -------- - ---------------------------------
---------------------- -- -
  -----------------
---

需要注意的是,如果 NodeList 是 live 的,那么在迭代时,如果文档结构发生变化,可能会导致一些节点被跳过或者重复遍历。因此,最好在迭代之前将其转换成静态的数组:

----- -------- - ---------------------------------
----- -------- - ---------------------
---------------------- -- -
  -----------------
---

总结

NodeList 是一个表示包含零个或多个节点的列表的类数组对象。它可以通过 document.querySelectorAll() 或者 element.querySelectorAll() 方法获取。对于不同的获取方式,NodeList 可能是 live 的或者 static 的,这取决于文档结构的变化是否会影响 NodeLIst 的内容。我们可以使用索引或者 forEach 方法访问其中的节点,并且可以通过将其转换成静态数组来解决 live NodeList 迭代时可能出现的问题。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/28129


猜你喜欢

  • 单页应用中如何处理错误的URL(404错误)

    在单页应用程序(SPA)中,URL是一个重要的导航工具。然而,当用户访问不存在的URL时,服务器会返回404错误,这可能会影响用户体验并且破坏了应用的完整性。因此,正确地处理错误的URL是任何前端应用...

    7 年前
  • jQuery Compatible JavaScript Documentation Generator

    在前端开发中,需要使用各种JavaScript库和框架来实现设计。其中jQuery是最常用的之一,然而随着ES6和新版浏览器的普及,jQuery已经不再像以前那样必要。

    7 年前
  • 在 javascript Bookmarklet(使用 window.open)中添加 favicon

    简介 favicon 是出现在浏览器标签页、收藏夹等地方的小图标。它可以提高网站的可识别性和专业性,同时也为用户提供了更好的体验。 在本文中,我们将学习如何在 javascript Bookmarkl...

    7 年前
  • Failed to clear temp storage

    在前端开发中,我们经常需要使用浏览器的本地存储来缓存数据、图片等资源文件,以提高网站的加载速度和用户的体验。然而,在使用本地存储时,我们可能会遇到一个常见的问题——"Failed to clear t...

    7 年前
  • 如何在移除 DOM 图片时避免内存泄漏?

    当我们撤销对文档对象模型(DOM)中的图片元素的引用时,很容易发生内存泄漏。这是因为浏览器在处理内存时并不总是可以正确地识别所有的对象。如果我们不小心遗留了一些无用的引用,那么这些对象就会一直占据内存...

    7 年前
  • Real time line graph with nvd3.js

    前言 在现代 Web 应用中,实时图表是一个非常重要的组成部分。这些图表可以帮助我们监视和展示数据的变化,从而更好地理解和分析数据。NVD3.js 是一款基于 D3.js 的 JavaScript 图...

    7 年前
  • Determine Maximum Possible DIV Height

    在前端开发中,经常需要动态计算元素的高度。然而当父级容器高度未知时,则需要确定子元素的最大可能高度。本文将介绍如何通过 JavaScript 和 CSS 来实现这一目标。

    7 年前
  • 将光标设置为 <symbol> 元素

    在前端开发中,我们经常需要将光标(cursor)设置为某个特定的元素。通常情况下,这个元素是一个表单控件或者链接等常见的交互元素。不过,有时候我们可能需要将光标设置为一个 元素,以实现更加独特和创新...

    7 年前
  • ES6 中花括号内的函数参数列表是做什么的?

    在 ES6 中,我们可以在花括号内定义一个函数,并为它传入一些参数。这种写法被称为“解构函数参数”(destructuring function parameters),它可以方便地将对象或数组作为参...

    7 年前
  • 如何在 Greasemonkey 脚本中拦截 XMLHttpRequests?

    Greasemonkey 是一种用户脚本管理器,可用于修改网页的行为和外观。在编写 Greasemonkey 脚本时,我们可能需要拦截网页中发出的 XMLHttpRequests 请求,并对其进行处理...

    7 年前
  • 如何在Redux状态中将方法注入对象

    Redux是一个流行的JavaScript库,用于管理应用程序的状态。它使用一个称为Store的单一状态树来存储应用程序状态,并通过派发操作(Action)来更新该状态。

    7 年前
  • Angular2: 通过编程方式创建子组件

    在Angular应用程序中,通常需要在一个组件中使用另一个组件。有时,这些组件需要动态创建和销毁。本文将介绍如何使用Angular2从父组件中以编程方式创建并管理子组件。

    7 年前
  • Douglas Crockford on Class Free OOP in JavaScript

    JavaScript是一门基于原型(Prototype-based)的语言,与传统的基于类(Class-based)的面向对象编程语言有所不同。Douglas Crockford是JavaScript...

    7 年前
  • Web Workers 处理 AJAX 请求 - 优化过度?

    在前端开发中,处理大量数据的情况下,我们通常会使用 AJAX 请求来获取需要展示的数据。但是由于 JavaScript 是单线程执行的语言,可能会导致页面卡顿或者响应变慢。

    7 年前
  • EcmaScript 5 浏览器实现

    EcmaScript是JavaScript的标准化规范,而EcmaScript 5则是该规范的第五个版本。在这篇文章中,我们将讨论EcmaScript 5在浏览器中的实现。

    7 年前
  • JavaScript函数参数中的单引号转义

    在JavaScript中,单引号是用于字符串文字的常见字符。但是,在某些情况下,如果您想在函数参数中包含单引号,则需要将其转义以避免出错。在本文中,我们将学习如何在JavaScript函数参数中正确地...

    7 年前
  • Fetch 进度指示器

    在前端开发中,我们常常需要向服务器请求数据。使用 fetch API 可以方便地进行网络请求。但是,当我们发送请求时,用户可能会感觉页面长时间没有响应或者看不到请求的进度。

    7 年前
  • 如何将 ES6 Map 对象转换为 JSON 字符串?

    在前端开发中,我们经常需要将 JavaScript 对象转换为 JSON 字符串。但是,ES6 中新增的 Map 对象并不支持直接使用 JSON.stringify() 方法进行序列化。

    7 年前
  • iOS - 解决手动聚焦输入框/文本域的问题

    在 iOS 设备上,有时候需要通过 JavaScript 来手动聚焦(focus)到一个输入框或者文本域。但是,一些 iOS 版本会存在一些问题,比如手动聚焦后无法弹出软键盘,或者软键盘被唤起后无法输...

    7 年前
  • 如何增加Google Chrome Developer Tools(或Firefox)中的调用栈条目数?

    当开发者在调试程序的时候,经常需要查看函数调用栈以及它的层次结构。虽然Chrome和Firefox的开发者工具都提供了一个非常有用的调用栈跟踪器,但默认情况下,调用栈的层数可能不足以满足实际需求。

    7 年前

相关推荐

    暂无文章