元の質問に答えて、あなたはfor/in
間違って使用しています。あなたのコードでkey
は、インデックスです。したがって、疑似配列から値を取得するには、実行する必要がlist[key]
あり、IDを取得するには、実行する必要がありますlist[key].id
。しかし、for/in
そもそもこれを行うべきではありません。
概要(2018年12月に追加)
for/in
nodeListやHTMLCollectionの反復には使用しないでください。これを回避する理由は次のとおりです。
最近のブラウザー(Safari、Firefox、Chrome、Edge)の最近のバージョンはすべて、またはのfor/of
ようなDOMリストの反復をサポートしています。nodeList
HTMLCollection
次に例を示します。
var list = document.getElementsByClassName("events");
for (let item of list) {
console.log(item.id);
}
古いブラウザ(IEなどを含む)を含めるには、これはどこでも機能します。
var list= document.getElementsByClassName("events");
for (var i = 0; i < list.length; i++) {
console.log(list[i].id); //second console output
}
使用してはいけない理由の説明 for/in
for/in
オブジェクトのプロパティを繰り返すためのものです。つまり、オブジェクトのすべての反復可能なプロパティを返します。配列(配列要素または疑似配列要素を返す)で機能しているように見えるかもしれませんが、配列のような要素からは期待されていないオブジェクトの他のプロパティを返すこともあります。そして、オブジェクトHTMLCollection
またはnodeList
オブジェクトの両方が、for/in
反復で返される他のプロパティを持つことができると思います。私はこれをChromeで試してみて、リスト内の項目(インデックス0、1、2など)を取得する方法で繰り返しますが、length
およびitem
プロパティも取得します。for/in
反復は単にHTMLCollectionのために動作しません。
でHTMLCollectionを反復できない理由については、http: //jsfiddle.net/jfriend00/FzZ2H/を参照してくださいfor/in
。
Firefoxでは、for/in
イテレーションは次の項目(オブジェクトのすべての反復可能なプロパティ)を返します。
0
1
2
item
namedItem
@@iterator
length
うまくいけば、今度は、for (var i = 0; i < list.length; i++)
代わりにを使用したい理由がわかるので0
、1
を取得2
し、イテレーションで使用できます。
以下は、2015年から2018年にかけてブラウザがどのように進化したかを示したものであり、反復するための追加の方法を提供します。上記のオプションを使用できるため、現在のブラウザではこれらは必要ありません。
2015年のES6のアップデート
ES6に追加されたのはArray.from()
、配列のような構造を実際の配列に変換することです。これにより、次のようにリストを直接列挙できます。
"use strict";
Array.from(document.getElementsByClassName("events")).forEach(function(item) {
console.log(item.id);
});
作業デモ(2016年4月現在のFirefox、Chrome、Edge):https : //jsfiddle.net/jfriend00/8ar4xn2s/
2016年のES6のアップデート
これをコードに追加するだけで、ES6 for / ofコンストラクトをa NodeList
とan で使用できるようにHTMLCollection
なります。
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
HTMLCollection.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
次に、次のことができます。
var list = document.getElementsByClassName("events");
for (var item of list) {
console.log(item.id);
}
これは、Chrome、Firefox、およびEdgeの現在のバージョンで機能します。これは、ArrayイテレータをNodeListプロトタイプとHTMLCollectionプロトタイプの両方に接続し、for / ofを反復するときに、Arrayイテレータを使用してそれらを反復するため機能します。
作業デモ:http : //jsfiddle.net/jfriend00/joy06u4e/。
2016年12月のES6の2回目の更新
2016年12月の時点で、Symbol.iterator
サポートはChrome v54およびFirefox v50に組み込まれているため、以下のコードはそれ自体で機能します。Edgeにはまだ組み込まれていません。
var list = document.getElementsByClassName("events");
for (let item of list) {
console.log(item.id);
}
作業デモ(ChromeおよびFirefox):http : //jsfiddle.net/jfriend00/3ddpz8sp/
2017年12月のES6の3番目のアップデート
2017年12月の時点では、この機能のためのエッジ41.16299.15.0で作品nodeList
のようdocument.querySelectorAll()
ではなく、HTMLCollection
のようにdocument.getElementsByClassName()
あなたが持っているので、手動のためにエッジにそれを使用するイテレータを割り当てますHTMLCollection
。あるコレクションタイプを修正し、他のコレクションタイプを修正しないのは、完全な謎です。ただし、現在のバージョンのEdge document.querySelectorAll()
では、少なくともES6 for/of
構文の結果を使用できます。
上記のjsFiddleも更新して、両方HTMLCollection
をnodeList
個別にテストし、jsFiddle自体に出力をキャプチャします。
2018年3月のES6の4番目のアップデート
mesqueeebごとSymbol.iterator
に、Safariにもサポートが組み込まれているfor (let item of list)
ため、document.getElementsByClassName()
またはのどちらでも使用できますdocument.querySelectorAll()
。
2018年4月のES6の5番目のアップデート
どうやら、HTMLCollection
with 反復のサポートはfor/of
2018年秋にEdge 18で行われる予定です。
2018年11月のES6の6番目のアップデート
Microsoft Edge v18(2018年秋のWindows Updateに含まれています)では、HTMLCollectionとNodeListの両方をEdgeのfor / ofで反復できることを確認できます。
そのため、現在のすべてのブラウザーにはfor/of
、HTMLCollectionオブジェクトとNodeListオブジェクトの両方の反復に対するネイティブサポートが含まれています。