Result of `document.getElementsByClassName` doesn't have array methods like `map` defined, even though it is an array
我具有以下代码来选择一些div并在其上添加点击处理程序
1 2 3 4 5 6 7 | var tiles = document.getElementsByClassName("tile"); tiles.map(function(tile, i){ tile.addEventListener("click", function(e){ console.log("click!"); }); }); |
这将引发错误,因为即使tile是数组,也未定义
如果我创建这样的数组,则映射可以正常工作:
1 2 | var a = [1, 2, 3, 4]; a.map(/*whatever*/); |
一种解决方法是将地图附加到图块上,如下所示:
1 | tiles.map = Array.prototype.map; |
这很好。
我的问题是为什么
对,它实际上不是数组。这是"类似数组的"。
不要将
1 | Array.prototype.map.call(tiles, function...) |
有人可能会建议
1 | Array.prototype.slice.call(tiles).map(function... |
归结为同一件事。有些人喜欢写
1 | [].slice.call(tiles).map(function... |
可以节省一些击键。
当然,由于您并没有真正使用
1 2 3 4 5 | for (var i = 0; i < tiles.length; i++) { tiles[i].addEventListener("click", function(e){ console.log("click!"); }); } |
另请参见MDN中的说明。尽管本文讨论了
在ES6中,我们有一些更简单的方法可以将
1 2 | [...tiles] Array.from(tiles) |