我尝试从元素数组中获取索引。
var arr = document.getElementsByClassName('class'); //3 elements
console.log(arr);
output// [div.class.selected, div.class, div.class, item: function, namedItem: function]
var selected = document.getElementsByClassName('selected');
var selected_id = arr.indexOf(selected[0]);
最后一行代码给我一个错误Uncaught TypeError: undefined is not a function
。
我还尝试添加toString()
并搜索,但同样的错误。
答案 0 :(得分:8)
因为arr
是(实时)NodeList而不是数组;你想要的是,我想:
console.log([].indexOf.call(arr, selected[0]));
var arr = document.getElementsByClassName('class');
var selected = document.getElementsByClassName('selected');
var selected_id = [].indexOf.call(arr, selected[0]);
console.log(selected_id);

<div class="class"></div><div class="class"></div><div class="class selected"></div><div class="class"></div>
&#13;
该行:
var selected_id = [].indexOf.call(arr, selected[0]);
使用原生Array.prototype.indexOf()
方法,将arr
作为this
(基本上使用arr
作为调用该方法的数组),提供{{1}作为要传递给方法的参数,所以当你自己调用它时,排序会被应用:
selected[0]
但是以一种方式识别var selected_id = arr.indexOf(selected[0]);
方法对indexOf()
对象不可用(以合法的方式调用它,从而防止错误)。
参考文献:
答案 1 :(得分:3)
getElementsByClassName
不会返回数组,而是HTMLCollection
。因此,它没有像indexOf
这样的数组方法。您需要显式调用this
的{{1}}值的数组方法,如下所示:
HTMLCollection
答案 2 :(得分:3)
这是因为document.getElementsByClassName('class')
不返回Array
,而是NodeList
,它是一个类似数组的对象。您可以使用以下命令将类似数组的对象转换为数组:
var elements = document.getElementsByClassName('class');
var arr = Array.prototype.slice.call(elements);