querySelectorAll 和 getElementsBy* 方法返回什么?

2023-12-19

Do getElementsByClassName(以及类似的功能,例如getElementsByTagName and querySelectorAll) 工作方式与getElementById或者它们返回一个元素数组?

我问的原因是因为我试图使用更改所有元素的样式getElementsByClassName。见下文。

//doesn't work
document.getElementsByClassName('myElement').style.size = '100px';

//works
document.getElementById('myIdElement').style.size = '100px';

Your getElementById https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById代码可以工作,因为 ID 必须是唯一的,因此该函数始终返回恰好一个元素(或null如果没有找到)。

然而,这些方法getElementsByClassName https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName, getElementsByName https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByName, getElementsByTagName https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByTagName, and getElementsByTagNameNS https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByTagNameNS返回一个可迭代的元素集合。

方法名称提供了提示:getElement暗示singular, 然而getElements暗示plural.

方法querySelector https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelectorAll还返回单个元素,并且querySelectorAll https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelectorAll返回一个可迭代的集合。

可迭代集合可以是NodeList https://developer.mozilla.org/en-US/docs/Web/API/NodeList or an HTMLCollection https://developer.mozilla.org/en-US/docs/Web/API/HTMLCollection.

getElementsByName https://html.spec.whatwg.org/multipage/dom.html#the-document-object and querySelectorAll https://dom.spec.whatwg.org/#interface-parentnode都指定返回一个NodeList;另一个getElementsBy* methods https://dom.spec.whatwg.org/#interface-document被指定返回一个HTMLCollection,但请注意,某些浏览器版本的实现方式有所不同。

这两种集合类型不提供与元素、节点或类似类型相同的属性;这就是为什么阅读style off of document.getElements()失败。 换句话说:NodeList or an HTMLCollection没有style;只有一个Element has a style.


这些“类似数组”的集合是包含零个或多个元素的列表,您需要对其进行迭代才能访问它们。 虽然您可以像数组一样迭代它们,但请注意,它们是不同的 https://stackoverflow.com/q/29707568 from Arrays https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array.

在现代浏览器中,您可以将这些可迭代对象转换为适当的数组Array.from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from;那么你可以使用forEach和别的数组方法,例如迭代法 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#instance_methods:

Array.from(document.getElementsByClassName("myElement"))
  .forEach((element) => element.style.size = "100px");

在不支持的旧浏览器中Array.from或迭代方法,您仍然可以使用Array.prototype.slice.call https://stackoverflow.com/q/7056925。 然后你可以像使用真正的数组一样迭代它:

var elements = Array.prototype.slice
    .call(document.getElementsByClassName("myElement"));

for(var i = 0; i < elements.length; ++i){
  elements[i].style.size = "100px";
}

您还可以迭代NodeList or HTMLCollection本身,但请注意,在大多数情况下,这些集合是live (MDN docs https://developer.mozilla.org/en-US/docs/Web/API/NodeList#live_vs._static_nodelists, DOM spec https://dom.spec.whatwg.org/#concept-collection-live),即它们随着 DOM 的变化而更新。 因此,如果您在循环时插入或删除元素,请确保不会意外跳过一些元素 https://stackoverflow.com/q/15562484 or 创建无限循环 https://stackoverflow.com/q/9709351。 MDN 文档应始终注明方法返回实时集合还是静态集合。

例如,一个NodeList提供了一些迭代方法,例如forEach在现代浏览器中:

document.querySelectorAll(".myElement")
  .forEach((element) => element.style.size = "100px");

一个简单的for也可以使用循环:

var elements = document.getElementsByClassName("myElement");

for(var i = 0; i < elements.length; ++i){
  elements[i].style.size = "100px";
}

Aside: .childNodes https://developer.mozilla.org/en-US/docs/Web/API/Node/childNodes产生一个live NodeList and .children https://developer.mozilla.org/en-US/docs/Web/API/Element/children产生一个live HTMLCollection,所以这两个吸气剂也需要小心处理。


有一些图书馆像jQuery https://jquery.com这使得 DOM 查询变得更短,并在“一个元素”和“元素集合”上创建了一个抽象层:

$(".myElement").css("size", "100px");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

querySelectorAll 和 getElementsBy* 方法返回什么? 的相关文章

  • 如何将国家/地区代码与电话号码分开?

    我的数据库中有很多电话号码 例如 1 123 456 7890 我要做的是将国家 地区拨号代码 在本例中为美国 加拿大的 1 与电话号码分开 我尝试创建所有国家 地区的 JSON 列表 并在加载页面时将电话号码和国家 地区代码分开 它工作正
  • 如何禁用 Ext JS 中组合框中的项目?

    如何禁用 Ext JS 组合框中的特定项目 例如我有这些记录 row 1 type 1 row 2 type 2 row 3 type 3 我想禁用第三行 即它应该作为标签保留在组合中 但它将显示为灰色且不可单击 这是至少可以用于 Ext
  • 用于标记查询的 JavaScript 正则表达式

    您好 我偶然发现了一个与正则表达式相关的问题 但我无法解决 我需要对查询进行标记 将查询分成几部分 假设以下一个为例 These are the separate query elements These are compound comp
  • PrimeNG 数据表日期范围过滤器

    过滤日期范围 https stackblitz com edit angular fpowo5 file app components transactionList transactionList html 7C 数据表 https ww
  • 可访问性和所有这些 JavaScript 框架

    我研究一些 JavaScript 框架 例如 Backbone js 和 Batman js 已经有一段时间了 虽然我真的很喜欢它们 但我一直在关注一件棘手的事情 这个问题就是可访问性 作为一名网络开发人员 我一直试图让我的网站和应用程序考
  • 在javascript中使用正则表达式从字符串中提取子字符串

    我是 javascript 新手 如何提取与 javascript 字符串中的正则表达式匹配的子字符串 例如在Python中 version regex re compile r d d d line 2021 05 29 Version
  • 是否可以更改 Google Chatbot 的“卡片”“宽度”?

    我环顾四周想要改变card width由 Google Chatbot 创建 但据我所知 Chatbot API 中没有任何配置 是否可以以某种方式设置属性 我现在的Card class class Card constructor tit
  • 如何动态地从对象中提取所有元素

    如何从对象中提取特定列 我有一个列数组 我希望从对象中提取这些字段 该对象将由作为项目的映射循环函数构造 现在在这里 如何动态检查我的字段 我不想要这样的 item col 0 请告诉我一个捷径 const person firstName
  • 在 AngularJS 和 Nodejs 之间共享代码

    使用在前端和后端之间共享代码的最佳方式是什么javascript 特别是说之间nodejs and angularjs 问题是我们使用的是相同的enums and constant values例如error codes在后端和前端 现在
  • 如何使用 angular2 在客户端生成 rsa 密钥对?

    我需要知道如何使用 angular2 在客户端生成 rsa 密钥对 我需要生成私钥 公钥对并将私钥保存到数据库中 并希望在客户端内使用公钥 我怎样才能实现这个 我找到了这个https www npmjs com package genera
  • 范围滑块 javascript 以小时和分钟为单位

    我试图分别以小时和分钟为单位显示滑块的值 我对 JS 还很陌生 并且仍在尝试了解它是如何工作的 到目前为止 我所拥有的是一个工作滑块 其最大值为 1440 24 小时内的分钟 在 JS 中 我尝试将其划分为小时和分钟 并使用 innerHt
  • 如何对页面的某个部分进行实时更新?

    我需要刷新页面的各个部分 以便在有新数据时进行更新 我该怎么办 使用jquery 例子 是的 jQuery 非常适合这个 查看这些方法 http api jquery com category ajax http api jquery co
  • 如何使用 JavaScript 获取光标下的单词?

    如果我有 p some long text p 在我的 HTML 页面上 我如何知道鼠标光标位于 文本 一词上方 我的另一个答案仅适用于 Firefox 这个答案适用于 Chrome 也许在 Firefox 中也能工作 我不知道 funct
  • GraphQL:从对象构建查询参数

    如果我有一个对象 where publishedAt lt 2018 01 01 如何将其转换为适合查询参数的字符串 articles where publishedAt lt 2018 01 01 这看起来是一个有趣的库 我建议检查一下
  • 切换 Ag-Grid 中的浮动过滤器?

    我试图通过开关或按钮单击来确定浮动过滤器的显示 看起来很简单 我应该能够在 true 和 false 之间切换 将该值提供给网格选项中的浮动过滤器 然后刷新标题 对吗 不幸的是 网格似乎总是落后一步 当我第一次点击时 什么也没有发生 当我将
  • 如何让机器人状态显示为“手机在线”

    我看到 NotSoBot 的状态为在线在移动 https i stack imgur com IiF4k png 有没有办法可以在discord js 中做到这一点 我知道这已经很旧了 但更简单的方法是将其添加到定义客户端 机器人的位置 c
  • JSON 解析错误 - JSON 中位置 1 处出现意外标记 o

    我需要获取一个 JSON 对象并记录标题控制台以实现自动完成功能 我的 json 的示例如下 title Example 1 url http www example1 com title Example 2 url http www ex
  • 递归process.nextTick警告

    作为我的应用程序的一部分 我有以下代码行 process nextTick function pre populate cache with all users console log scanning users table in ord
  • 使用 javascript 和 jQuery UI datepicker 获取工作日数

    我有两个日期选择器 我可以从中计算天数 而无需计算星期六和星期日 但我想在周五和周六这样做 我尝试过一些不同的方法但失败了 对我来说 处理不包括周六和周日的天数很容易 但处理周五和周六的天数则不然 以下是我的 javascript 代码 f
  • JavaScript - babel-preset-env 不为 IE11 转换箭头函数

    我很难尝试配置 Babel 来转译 IE11 可以理解的代码 特别是箭头函数 跑步npx webpack mode development使用我的配置不会转换我的代码中的箭头函数 在eval 在生成的代码中的语句中 我可以看到所有实例都未转

随机推荐