私のJSFiddle では、要素の配列を繰り返し処理しようとしています。ログ文が証明するように、配列は空ではありません。それでも、forEach
を呼び出すと、(あまり役に立たない)「不明なTypeError
:undefined
は関数ではありません」というエラーが表示されます。
私は何か愚かなことをしているに違いありません。私は何を間違えていますか?
私のコード:
var arr = document.getElementsByClassName('myClass');
console.log(arr);
console.log(arr[0]);
arr.forEach(function(v, i, a) {
console.log(v);
});
.myClass {
background-color: #FF0000;
}
<div class="myClass">Hello</div>
これは、document.getElementsByClassName
が配列ではなく HTMLCollection を返すためです。
幸いなことに、それは "array-like" object (オブジェクトであるかのようにログに記録される理由と、標準のfor
ループで反復できる理由を説明します)で、これを行うことができます:
[].forEach.call(document.getElementsByClassName('myClass'), function(v,i,a) {
ES6(最新のブラウザまたはBabel)では、 Array.from
を使用して、配列のようなオブジェクトから配列を構築することもできます。
Array.from(document.getElementsByClassName('myClass')).forEach(v=>{
または、配列のようなオブジェクトを配列に広げます:
[...document.getElementsByClassName('myClass'))].forEach(v=>{
これを試してみてください:
<html>
<head>
<style type="text/css">
</style>
</head>
<body>
<div class="myClass">Hello</div>
<div class="myClass">Hello</div>
<script type="text/javascript">
var arr = document.getElementsByClassName('myClass');
console.log(arr);
console.log(arr[0]);
arr = [].slice.call(arr); //I have converted the HTML Collection an array
arr.forEach(function(v,i,a) {
console.log(v);
});
</script>
<style type="text/css">
.myClass {
background-color: #FF0000;
}
</style>
</body>
</html>
特定のクラスの各要素のIDにアクセスする場合は、次を実行できます。
Array.from(document.getElementsByClassName('myClass')).forEach(function(element) {
console.log(element.id);
});