当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《DOM对象的Javascript集合-为什么我不能用Array.reverse()反转?》经验,为你挑选了2个好方法。

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

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

在Firefox 3中,当我调用该reverse()方法时,脚本停止执行并在Web Developer Toolbar的控制台中显示以下错误:

imagesArr.reverse is not a function

所述imagesArr变量可以通过与一个for循环和元件等被迭代imagesArr[i]可以被访问,那么,为什么不调用时视为一个阵列reverse()的方法?



1> Adam Wright..:

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

有关更多信息,请参见http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-536297177.



2> Vincent Robe..:

getElementsByTag()返回NodeList而不是Array.您可以将NodeList转换为Array但请注意该数组将是另一个对象,因此反转它不会影响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);


不,你不能直接在`NodeList`上调用该方法,因为它的索引是不可写的.它应该抛出一个错误.
ES6:`arrayNodes = Array.from(listNodes)`
推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有