您的getElementById
代码可以工作,因为ID必须是唯一的,因此该函数始终只返回一个元素(或者如果没有找到任何元素)。null
但是,方法 getElementsByClassName
、getElementsByName
、getElementsByTagName
和 getElementsByTagNameNS
返回元素的可迭代集合。
方法名称提供提示:暗示单数,而暗示复数。getElement
getElements
方法 querySelector
还返回单个元素,querySelectorAll
返回可迭代集合。
可迭代集合可以是 NodeList
或 HTMLCollection
。
getElementsByName
和 querySelectorAll
都指定为返回 ;其他 getElementsBy*
方法指定为返回 ,但请注意,某些浏览器版本以不同的方式实现此目的。NodeList
HTMLCollection
这两种集合类型都不提供与元素、节点或类似类型相同的属性。这就是为什么读出...失败。换句话说:a 或 an 没有 ;只有 有 .style
document.getElements
(
)
NodeList
HTMLCollection
style
Element
style
这些“类似数组”的集合是包含零个或多个元素的列表,您需要循环访问这些元素才能访问它们。虽然您可以像数组一样循环访问它们,但请注意,它们与 Array
s 不同。
在现代浏览器中,您可以将这些可迭代对象转换为具有Array.from的正确数组
;然后你可以使用和其他 Array 方法,例如迭代方法:forEach
Array.from(document.getElementsByClassName("myElement"))
.forEach((element) => element.style.size = "100px");
在不支持或迭代方法的旧浏览器中,您仍然可以使用Array.prototype.slice.call
。然后,您可以像使用真实数组一样对其进行迭代:Array.from
var elements = Array.prototype.slice
.call(document.getElementsByClassName("myElement"));
for(var i = 0; i < elements.length; ++i){
elements[i].style.size = "100px";
}
您也可以迭代 or 本身,但请注意,在大多数情况下,这些集合是实时的(MDN 文档,DOM 规范),即它们会随着 DOM 的更改而更新。因此,如果在循环时插入或删除元素,请确保不会意外跳过某些元素或创建无限循环。MDN文档应始终注意方法返回的是实时集合还是静态集合。NodeList
HTMLCollection
例如,a 提供了一些迭代方法,例如在现代浏览器中: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";
}
题外话:.childNodes
产生 live,.children
产生 live,所以这两个 getter 也需要小心处理。NodeList
HTMLCollection
有一些像jQuery这样的库,它们使DOM查询更短一些,并在“一个元素”和“元素集合”上创建了一个抽象层:
$(".myElement").css("size", "100px");