DOM 对象的 Javascript 集合 - 为什么我不能使用 Array.reverse() 反转?

StackOverflow https://stackoverflow.com/questions/45613

  •  09-06-2019
  •  | 
  •  

反转 DOM 对象数组可能会出现什么问题,如以下代码所示:

var imagesArr = new Array();
imagesArr = document.getElementById("myDivHolderId").getElementsByTagName("img");
imagesArr.reverse();

在 Firefox 3 中,当我调用 reverse() 方法脚本停止执行并在 Web 开发人员工具栏的控制台中显示以下错误:

imagesArr.reverse is not a function

imagesArr 变量可以使用 for 循环和类似元素进行迭代 imagesArr[i] 可以访问,那么为什么调用的时候看不到数组呢 reverse() 方法?

有帮助吗?

解决方案

因为 getElementsByTag name 实际上返回的是一个 NodeList 结构。为了语法方便,它具有类似数组的索引属性,但它是 不是 数组。例如,条目集实际上是在不断动态更新的 - 如果您在 myDivHolderId 下添加新的 img 标签,它将自动出现在 imagesArr 中。

http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-536297177 了解更多。

其他提示

getElementsByTag() 返回一个 NodeList 而不是一个 Array。您可以将 NodeList 转换为数组,但请注意该数组将是另一个对象,因此反转它不会影响 DOM 节点的位置。

var listNodes = document.getElementById("myDivHolderId").getElementsByTagName("img");
var arrayNodes = Array.slice.call(listNodes, 0);
arrayNodes.reverse();

为了更改位置,您必须删除 DOM 节点并将它们重新添加到正确的位置。

Array.prototype.slice.call(arrayLike, 0) 是将类数组转换为数组的好方法,但如果您使用 JavaScript 库,它实际上可能提供更好/更快的方法来执行此操作。例如,jQuery 有 $.makeArray(arrayLike).

您还可以直接在 NodeList 上使用 Array 方法:

Array.prototype.reverse.call(listNodes);

getElementsByTag() 返回一个 NodeList 而不是一个 Array。您需要将 NodeList 转换为数组,然后将其反转。

var imagesArr = [].slice.call(document.getElementById("myDivHolderId").getElementsByTagName("img"), 0).reverse();

我知道这个问题很老了,但我认为它需要一些澄清,因为这里的一些答案已经过时了,因为 W3C 改变了定义,从而改变了这些方法的返回值 getElementsByTagName()getElementsByClassName()

这些方法 截至撰写此答案时 返回一个类型的对象(无论是否为空) HTMLCollection不是 NodeList.

就像属性之间的区别 children 它返回一个类型的对象 HTMLCollection 因为它仅由元素组成并且不包括文本或注释节点,并且 childNodes 它返回一个类型的对象 NodeList 因为它也可以包含其他节点类型,例如文本和注释。

笔记:我会在这里继续切线并表达我对原因缺乏洞察力 querySelectorAll() 方法当前返回一个 NodeList 而不是一个 HTMLCollection 因为它只适用于文档中的元素节点,仅适用于其他内容。

可能这与未来其他节点类型的潜在覆盖有关,他们寻求一种更面向未来的解决方案,谁知道呢?:)

编辑:我想我有这个决定背后的理由 NodeList 而不是一个 HTMLCollection 为了 querySelectorAll().

自从他们建造 HTMLCollection 为了完全完全实时,并且由于此方法不需要此实时功能,因此他们决定使用 NodeList 而是为了经济、高效地最好地实现其目的。

你的第一行是无关紧要的,因为它不会强制分配给变量,javascript以另一种方式工作。imagesArr 不是 Array() 类型,而是 getElementsByTagName("img") 的返回类型。在本例中,它是 Firefox 3 中的 HtmlCollection。

该对象的唯一方法是索引器和长度。为了反向工作,只需向后迭代即可。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top