您的getElementById代码可以工作,因为ID必须是唯一的,因此该函数始终只返回一个元素(或者如果没有找到任何元素)。null
但是,方法 getElementsByClassName、getElementsByName、getElementsByTagName 和 getElementsByTagNameNS 返回元素的可迭代集合。
方法名称提供提示:暗示单数,而暗示复数。getElementgetElements
方法 querySelector 还返回单个元素,querySelectorAll 返回可迭代集合。
可迭代集合可以是 NodeList 或 HTMLCollection。
getElementsByName 和 querySelectorAll 都指定为返回 ;其他 getElementsBy* 方法指定为返回 ,但请注意,某些浏览器版本以不同的方式实现此目的。NodeListHTMLCollection
这两种集合类型都不提供与元素、节点或类似类型相同的属性。这就是为什么读出...失败。换句话说:a 或 an 没有 ;只有 有 .styledocument.getElements()NodeListHTMLCollectionstyleElementstyle
这些“类似数组”的集合是包含零个或多个元素的列表,您需要循环访问这些元素才能访问它们。虽然您可以像数组一样循环访问它们,但请注意,它们与 Arrays 不同。
在现代浏览器中,您可以将这些可迭代对象转换为具有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文档应始终注意方法返回的是实时集合还是静态集合。NodeListHTMLCollection
例如,a 提供了一些迭代方法,例如在现代浏览器中:NodeListforEach
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 也需要小心处理。NodeListHTMLCollection
有一些像jQuery这样的库,它们使DOM查询更短一些,并在“一个元素”和“元素集合”上创建了一个抽象层:
$(".myElement").css("size", "100px");