我创建了一个简单的html& javascript文件,我试图在点击时获取元素索引,为什么我得到“indexOf不是一个函数”? 继承人代码:
<button id="1">1</button>
<button id="2">2</button>
<button id="3">3</button>
<button id="4">4</button>
<button id="1">5</button>
<script>
var items = document.getElementsByTagName('button');
for(var i = 0; i < items.length; i++) {
items[i].addEventListener('click', function(){
var ind = items.indexOf(this);
console.log(ind);
});
}
</script>
答案 0 :(得分:3)
indexOf
是在Array对象上找到的方法。
getElementsByTagName
返回一个实时HTMLCollection,而不是一个数组。它在很多方面都是类似数组的(例如,它具有数字索引属性和length
)但它没有数组的所有属性。
您可以访问Array(或Array构造函数的原型)的indexOf
属性,并使用.call()
或.apply()
在其中使用它HTMLCollection对象。
答案 1 :(得分:2)
原因是@Quentin提到了一个。
要解决此问题,您可以使用HTMLCollection
从Array.prototype.slice
创建一个新数组:
var items = document.getElementsByTagName('button');
items = Array.prototype.slice.call(items);
...
您可以在此处详细了解如何使用.slice
将类似数组的对象转换为数组:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/slice#Array-like_objects
ES2015替代
使用ES2015,你有一些更惯用的选择:
var items = document.getElementsByTagName('button');
items = Array.from(items);
或:
var items = document.getElementsByTagName('button');
items = [...items];
答案 2 :(得分:0)
document.getElementsByTagName
returns an HTMLCollection,不是数组。 HTMLCollections没有indexOf
方法,这就是您收到此错误的原因。
您可以将列表转换为数组,这意味着您可以使用indexOf
。
var items = [].slice.call(document.getElementsByTagName('button')
答案 3 :(得分:0)
我可以通过闭包函数来获取元素索引!!
var items = document.getElementsByTagName('button');
for(var i = 0; i < items.length; i++) {
(function (a){
items[i].addEventListener('click', function(){
var ind = items[a];
console.log(ind);
});
})(i);
}